MATLAB - 第三个矩阵维的连接

时间:2016-10-21 18:44:20

标签: matlab image-processing matrix

我有一个大小为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

1 个答案:

答案 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));

我主要使用临时变量来解释过程中的每个步骤。