在割炬中将DoubleTensor矩阵除以DoubleTensor数字

时间:2017-02-14 17:19:08

标签: lua torch

我尝试使用torch.Tensor更新for循环中的实值数字矩阵。 这就是我想要做的事情:

-- W and P are of size NxN, r is of size N
delta_W = P * r:view(N, 1) * r:view(1, N) * P  -- this is an NxN
denominator = 1 + r:view(1, N) * P * r:view(N, 1)  -- this is a number
delta_W = delta_w / denominator  -- ## THIS ONE RAISES ERROR ##
W = W + delta_W

要明确:

denom             -> [torch.DoubleTensor of size 1x1]
P, delta_W, W     -> [torch.DoubleTensor of size 200x200]

进行除法时的错误是:

bad argument #2 to '?' (number expected at /usr/local/torch/pkg/torch/generic/TensorOperator.c:145)

我是一个沉重的numpy用户所以我想"广播"是问题,因此我尝试通过torch.repeatTensor(denom, N, N)模拟它而没有运气。如果denom只是一个数字(不是DoubleTensor),一切都运行正常。使用该元素也不起作用,delta_P / denom[1]会产生相同的错误。

我做错了什么?

编辑: 我尝试使用

denominator = (1 + r:view(1, N) * P * r:view(N, 1)):apply(function(x) return x^(-1) end)
delta_w = delta_w * torch.repeatTensor(denominator, N, N)

不会抛出错误,但结果是错误的。要查看此内容,请尝试以下操作:

torch.linspace(0, 3, 4):view(2, 2) * torch.Tensor(2, 2):fill(0.5)

2 个答案:

答案 0 :(得分:0)

我通过使用applyrepeatTensor和最后cmul来进行元素乘法

rPr = r:view(1, N) * P * r:view(N, 1)
denominator = (1 + rPr):apply(function(x) return x^(-1) end)
delta_w:cmul(torch.repeatTensor(denominator, N, N))

虽然我想知道这是否可以通过cutorch传输到GPU。

答案 1 :(得分:0)

如果您执行denominator[1][1],您将获得一个号码'而不是一个火炬.Tensor'。然后你可以正常编写除法语句。

-- W and P are of size NxN, r is of size N
delta_W = P * r:view(N, 1) * r:view(1, N) * P  -- this is an NxN
denominator = 1 + r:view(1, N) * P * r:view(N, 1)  -- this is a 1x1
delta_W = delta_w / denominator[1][1]
W = W + delta_W

顺便说一下,在第一个陈述中你想要转换一个P矩阵(P:t())吗?