假设你有一堆k张量,为了简单起见,我们设它们是2张量/矩阵:
X = rand(5,5); Y = rand(5,5);
是否有一个习语将它们组合成一个3张量,其中第一个维度索引矩阵?一种方法是
P(1,:,:) = X;
P(2,:,:) = Y;
,现在p有要求的尺寸2x5x5
。有更好的方法吗?例如,在numpy中可以简单地输入:
P = array((X,Y))
,但在matlab中输入P=[X Y]
或P=[X; Y]
将分别得到10x5
和5x10
矩阵,而不是预期的2x5x5
。
使用cat
命令
假设你有5个大小为(x,y,z)
的矩阵,
A = rand(x,y,z); B = rand(x,y,z); C = rand(x,y,z); D = rand(x,y,z); E = rand(x,y,z);
连接的矩阵将是
M = cat(4, A, B, C, D, E);
其中4
表示第四维。输出M
的大小为(x,y,z,5)
。在MATLAB中,每个矩阵A,B,...
的大小为(x,y,z,1,1,...)
,即它们的第四维长度为1。
在连接之后,可能需要更改维度索引的顺序,以便第一个维度是新创建的维度。使用permute
命令
N = permute(M, [4, 1, 2, 3]);
输出矩阵N
的大小为(5,x,y,z)
。
编辑历史
- 将输入矩阵大小从
(3,3,3)
更改为(x,y,z)
,以便在串联和排列时清晰区分各个维度。 - 增加
permute
,以满足OP的尺寸索引要求。
一般来说,MATLAB中的单元格数组相当于Python列表(它们可以存储不同类型的对象),因此您可以编写:
%# combine
P = {X Y}; %# or: P = {X;Y};
%# access the elements
P{1}
P{2}
在这种情况下(相同大小和类型的矩阵),正如@rwong所示,沿着新的维度进行连接可能是一种方法…