Torch张量交换维度

我在一个 torch 项目中发现了这两行代码(并排):

 im4[{1,{},{}}] = im3[{3,{},{}}]
 im4[{3,{},{}}] = im3[{1,{},{}}]

这两行代码是干什么的呢?我认为它们进行了某种交换操作。

点赞
用户2726734
用户2726734

这在Torch Tensor文档的索引中有所涵盖。

使用空表{}进行索引是在该维度中的所有索引的速记。以下是一个例子,它使用{}将一整行从一个矩阵复制到另一个矩阵:

> a = torch.Tensor(3, 3):fill(0)
     0 0 0
     0 0 0
     0 0 0

> b = torch.Tensor(3, 3)
> for i=1,3 do for j=1,3 do b[i][j] = (i - 1) * 3 + j end end
> b
     1 2 3
     4 5 6
     7 8 9

> a[{1, {}}] = b[{3, {}}]
> a
    7 8 9
    0 0 0
    0 0 0

这个赋值相当于:a[1] = b[3]

你的例子也很类似:

 im4[{1,{},{}}] = im3[{3,{},{}}]
 im4[{3,{},{}}] = im3[{1,{},{}}]

这个等同于:

 im4[1] = im3[3]
 im4[3] = im3[1]

第一行为im4的第一行分配了值,其为im3的第三行(一个2D子矩阵)。而第二行为im3的第一行分配了值,并赋给了im4的第三行。

请注意,这不是一个交换,因为从im3中读取的值没有被写回去,而从im4中写入的值也没有被读取。

2015-06-30 03:27:14