我有一个大小为KxNxZ的3D矩阵。 我想将第三维中的子矩阵连接成单个尺寸为K * ZxN,s.t的2D矩阵。它们将被行连接起来。 什么是实现这一结果的最佳方式?
谢谢!
示例:
%generates input
M = cat(3,[(1:3)',(4:6)'],[(7:9)',(10:12)'],[(13:15)',(16:18)']);
DesiredOutput = [[(1:3)';(7:9)';(13:15)'],[(4:6)';(10:12)';(16:18)']];
输入矩阵
M(:,:,1) =
1 4
2 5
3 6
M(:,:,2) =
7 10
8 11
9 12
M(:,:,3) =
13 16
14 17
15 18
所需的输出矩阵:
DesiredOutput =
1 4
2 5
3 6
7 10
8 11
9 12
13 16
14 17
15 18
答案 0 :(得分:4)
Eskapp走在正确的轨道上。首先使用permute
来交换第二维和第三维,以便获得K x Z x N
矩阵。完成此操作后,您可以使用reshape
展开矩阵,以便获取每个尺寸为K x Z
的2D切片,并将其转换为单个列,并且2D切片的每列都将展开。值得庆幸的是,这就是MATLAB在重构矩阵时的工作原理,因此这需要花费很少的精力。然后,您将所有这些列连接在一起以构建矩阵。
首先以这种方式使用permute
:
Mp = permute(M, [1 3 2]);
这告诉我们您要交换第二维和第三维。接下来,在此矩阵上使用reshape
,以确保每列都有K x Z
个元素,其中2D切片的每一列都展开到一个列中。
DesiredOutput = reshape(Mp, [], size(M,2));
size(M,2)
访问原始矩阵中N
的值。因此,您希望DesiredOutput
包含K*Z
行和N
列。执行[]
会自动推断输出矩阵的行数,以简化操作。
我们得到:
>> DesiredOutput
DesiredOutput =
1 4
2 5
3 6
7 10
8 11
9 12
13 16
14 17
15 18
如果您不想使用临时变量,我们可以将所有内容组合成一个语句,如下所示。
DesiredOutput = reshape(permute(M, [1 3 2]), [], size(M,2));
我主要使用临时变量来解释过程中的每个步骤。