我有一个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
虽然正确,但似乎这个计算对我来说很慢。 谁能想出如何更有效地实现同一目标呢?
答案 0 :(得分:0)
您可以通过reshape
和permute
执行此操作。首先,了解重塑的工作原理。
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)])