Matlab是按列索引,三维矩阵的索引顺序是(行, 列, 页),而Python(numpy/torch)是按行索引,三维矩阵的索引顺序是(页, 行, 列)。Matlab的读取顺序是先读取列再读取行,通俗点说就是竖着读矩阵,传承自古老的Fortran;Python,包括C、C++、Java等高级语言,是按照先行后列的顺序,也就是横着读矩阵。当同样调用reshape(a, [m, n, k])时,即使都化成了维度相同的矩阵,里面的元素排列顺序也是不一样的,一不小心就会搞错。这里用一个小例子展示索引和reshape过程。Python的包numpy和torch函数调用和读取顺序差不多,这里以torch为例。
以三维数组为例,Matlab的索引顺序为(行, 列, 页), 例如:
K>> a = ones(4,2,3)
a(:,:,1) =
1 1
1 1
1 1
1 1
a(:,:,2) =
1 1
1 1
1 1
1 1
a(:,:,3) =
1 1
1 1
1 1
1 1
以torch为例,则是以(页, 行, 列)的顺序, 如下:
a = torch.ones(3,4,2)
>>>a
tensor([[[1., 1.],
[1., 1.],
[1., 1.],
[1., 1.]],
[[1., 1.],
[1., 1.],
[1., 1.],
[1., 1.]],
[[1., 1.],
[1., 1.],
[1., 1.],
[1., 1.]]])
在Matlab环境下,设置
K>> a(1,2,1) = 121