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?
答案 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)
根据需要。