最近在同时使用matlab及python处理张量时,发现一个很容易出错的地方,记录下来便于以后查看。
比如考虑一个向量v=kron(kron([0,1],[2,3]),[4,5])
也即v=[0 0 0 0 8 10 12 15]
将其看成
如果要交换第一和第二个分量,结果应该是
对应变换后的向量应该是:
v=[ 0 0 8 10 0 0 12 15]
如果在matlab中,先将该向量reshape成[2,2,2]型张量,再用permute交换1、2分量,最后重新reshape成一个行向量,会发现得到的向量为:
reshape(permute(reshape(v,[2,2,2]),[2,1,3]),[1,8])
ans = 0 0 0 0 8 12 10 15
也就是说实际交换的分量为2、3.
究其原因,是出在matlab的reshape函数上。
一般来说(比如在python中),如果将v转为一个三阶张量,如下
import numpy as np
a=np.array([0,0,0,0,8,10,12,15])
a[0,:,:]
得到结果是
array([[0, 0],
[0, 0]])
这表明,在当v=kron(kron([0,1],[2,3]),[4,5])转换为一个三阶张量后,[0,1]是其第一个分量;
但是当在matlab中运行同样的代码,如下
v=kron(kron([0,1],[2,3]),[4,5]);
v=reshape(v,[2,2,2]);
v(1,:,:)
结果为
ans(:,:,1) =
0 0
ans(:,:,2) =
8 12
这表明,[0,1]是这个三阶张量的第3个分量。这就是在进行张量的分量置换时,产生一些错误的原因,这主要是使用matlab会出现的错误。
拓展:在matlab中,将矩阵看成二阶张量时,行指标在前,列指标在后,比如:
v=[[1,2,3,4];[5,6,7,8]];
reshape(permute(reshape(v,[2,2,2]),[2,1,3]),[2,4])
得到结果
ans =
1 5 3 7
2 6 4 8