可以在不损失火炬(lua)参考的情况下连接张量吗?

时间:2016-02-07 09:43:08

标签: lua torch

th> x = torch.rand(2)
                                                                  [0.4943s] 
th> y = torch.rand(2)
                                                                  [0.0001s] 
th> x
 0.6115
 0.4986
[torch.DoubleTensor of size 2]
                                                                  [0.0002s] 
th> z = torch.cat(x,y)
                                                                  [0.0003s] 
th> z
 0.6115
 0.4986
 0.5171
 0.1785
[torch.DoubleTensor of size 4]

                                                                  [0.0001s] 
th> z[1] = 3
                                                                  [0.0001s] 
th> z[1]
 3  
                                                                  [0.0001s] 
th> x[1]
 0.61146148154512

修改z 修改x。是否有任何方法可以连接x和y,以便修改z会修改x?

1 个答案:

答案 0 :(得分:2)

你可以实现这种行为,但反过来说。你应该从一个更大的张量开始,你的主要“存储”,然后你可以创建子分配器,它将共享内部状态。

特别参见torch的{​​{1}}方法(以下代码示例来自Torch doc

:sub

正如您所看到的,x = torch.Tensor(5, 6):zero() > x 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 [torch.DoubleTensor of dimension 5x6] y = x:sub(2,4):fill(1) -- y is sub-tensor of x: > y -- dimension 1 starts at index 2, ends at index 4 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 [torch.DoubleTensor of dimension 3x6] > x -- x has been modified! 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 [torch.DoubleTensor of dimension 5x6] 变量实际上是y的一部分,并且更改了其值 - 也会更改x。这是非常通用的方式,因此您可以共享张量的多个部分。

因此,在您的情况下,它将类似于

x

打印

z = torch.Tensor(4):zero()
x = z:sub(1, 2)
y = z:sub(3, 4)
x[1] = 2
y[2] = 8
print(z)

根据需要。