【问题标题】:Vertically concatenating multidimensional matrix垂直连接多维矩阵
【发布时间】:2016-04-29 15:10:07
【问题描述】:

我有一个大小为2-by-7-by-N 的多维矩阵J,我想将它垂直连接成一个2*N-by-7 矩阵。

例如:

>> J(:,:,1:2)

ans(:,:,1) =

1.0000         0         0    0.2263         0    0.0069    0.4996
     0    1.0000         0    1.4156         0   -0.1665    0.0208

ans(:,:,2) =

2.0000         0         0   -0.3432         0   -0.0069    0.4996
     0    3.0000         0    1.3919         0    0.1665    0.0208

需要连接到

1.0000         0         0    0.2263         0    0.0069    0.4996
     0    1.0000         0    1.4156         0   -0.1665    0.0208
2.0000         0         0   -0.3432         0   -0.0069    0.4996
     0    3.0000         0    1.3919         0    0.1665    0.0208

如何做到这一点?

【问题讨论】:

    标签: arrays matlab matrix multidimensional-array


    【解决方案1】:

    使用permute 重新排列维度的顺序,然后使用reshape 将其更改为2*N-by-7 矩阵:

    reshape(permute(J, [1,3,2]),[],size(J,2));
    

    您需要permute 的原因是因为 MATLAB 是列优先的,这意味着它通过先向下列将多维数组的元素存储为向量。因此,当您调用 reshape 时,它​​首先查看列,然后在行数用完时移至下一列。由于您想将第 3 维堆叠在第 1 维之下,您需要确保当 reshape 用完行时,它会进入第 3 维。由于reshape 实际上进入了第二维,因此您需要使用permute 来交换第二维和第三维。

    只是为了好玩,这是另一种方法:

    J2 = permute(J, [2,1,3]);
    J2(:,:).'
    

    第三个使用comma-separated-lists 代替

    C = mat2cell(J, size(J,1), size(J,2), ones(1,1,size(J,3)));
    cat(1,C{:})   %// Or vertcat(C{:})
    

    【讨论】:

    • 完美运行!感谢您的帮助,非常感谢。