如何垂直堆叠nD数组的块?

时间:2017-02-03 00:45:55

标签: matlab

我有一个5D阵列A,想要垂直堆叠块 所有x,y和z的(x,y,z,:,:)。我做了以下事情:

    A = rand(128, 128, 64, 20, 3);
    a = 1; 
    for z = 1:Z
       for y = 1:Y
           for x = 1:X
               res(a:a+T-1,:) = squeeze(A(x,y,z,:,:));
               a = a + T;
           end
       end
    end

虽然正确,但似乎这个计算对我来说很慢。 谁能想出如何更有效地实现同一目标呢?

1 个答案:

答案 0 :(得分:0)

您可以通过reshapepermute执行此操作。首先,了解重塑的工作原理。

c = randi(9,[2 2 3])

c(:,:,1) =

     5     8
     2     6


c(:,:,2) =

     4     4
     5     1


c(:,:,3) =

     3     2
     2     3

让我们将c重塑为2 x 6矩阵。

ans =

     5     8     4     4     3     2
     2     6     5     1     2     3

现在是6 x 2矩阵。

ans =

     5     4
     2     1
     8     3
     6     2
     4     2
     5     3

在创建重新整形的矩阵时,MATLAB开始遍历c的第一维,并将其放在重新整形矩阵的第一维(即第一列中的行)中。具体地,

c(1,1,1) = 5
c(2,1,1) = 2
c(1,2,1) = 8
c(2,2,1) = 6
c(1,1,2) = 4
c(2,1,2) = 5 % stop since you would have filled 6 rows

形成重塑矩阵的第一列。

回到你的榜样,

重新整形矩阵的第一列将沿着20x3子矩阵的行,即第四维。第一行将沿着20x3子矩阵的列,即沿着第五维。但是,当您在重新整形的矩阵中从(1,1)遍历到(1,2)时,您将必须容纳前三个维度中的所有元素(即128, 128, 64,为什么?),因为您首先遍历您的x维度,然后是y,最后是z维度。所以你的答案是,你想沿着维度移动:4,1,2,3,5

答案:

sz_A = size(A);
p = sz_A(4)*prod(sz_A(1:3))
reshaped_A = reshape(permute(A,[4, 1, 2, 3, 5]), [p size(A,5)])