在matlab中转置和重塑一个3d数组

时间:2014-06-24 16:15:55

标签: performance matlab multidimensional-array vectorization

假设我有一个大小为n乘q的数组X.我想将其重新整形为具有p行的矩阵,并且在每一行中放置n行大小为q的串联,从而产生大小为p乘以nq的矩阵。

我设法用一个循环来做,但是如果n = 1000,p = 300,q = 300则需要一段时间。

F0=[];
for k=1:size(F,1)
    F0=[F0,squeeze(X(k,:,:))];
end

有更快的方法吗?

3 个答案:

答案 0 :(得分:2)

我认为这就是你想要的:

Y = reshape(permute(X, [2 1 3]), size(X,2), []);

n=2p=3q=4

的示例
>> X
X(:,:,1) =
     0     6     9
     8     3     0
X(:,:,2) =
     4     7     1
     3     7     4
X(:,:,3) =
     4     7     2
     6     7     6
X(:,:,4) =
     6     1     9
     1     4     3

>> Y = reshape(permute(X, [2 1 3]), size(X,2), [])
Y =
     0     8     4     3     4     6     6     1
     6     3     7     7     7     7     1     4
     9     0     1     4     2     6     9     3

答案 1 :(得分:2)

试试这个 -

reshape(permute(X,[2 3 1]),p,[])

因此,对于代码验证,可以查看示例案例运行 -

n = 2;
p = 3;
q = 4;

X = rand(n,p,q)
F0=[];
for k=1:n
    F0=[F0,squeeze(X(k,:,:))];
end
F0

F0_noloop = reshape(permute(X,[2 3 1]),p,[])

输出是 -

F0 =
    0.4134    0.6938    0.3782    0.4775    0.2177    0.0098    0.7043    0.6237
    0.1257    0.8432    0.7295    0.2364    0.3089    0.9223    0.2243    0.1771
    0.7261    0.7710    0.2691    0.8296    0.7829    0.0427    0.6730    0.7669
F0_noloop =
    0.4134    0.6938    0.3782    0.4775    0.2177    0.0098    0.7043    0.6237
    0.1257    0.8432    0.7295    0.2364    0.3089    0.9223    0.2243    0.1771
    0.7261    0.7710    0.2691    0.8296    0.7829    0.0427    0.6730    0.7669

答案 2 :(得分:0)

您可以查看代码以尝试找出可以提高性能的代码,而不是使用矢量化来解决问题。在这种情况下,由于您知道输出矩阵F0的大小应该是px(n * q),您可以预先将内存分配给F0并避免在每次迭代时不断调整矩阵的大小for循环

n=1000; 
p=300; 
q=300;

F0=zeros(p,n*q);

for k=1:size(F,1)
    F0(:,(k-1)*q+1:k*q) = squeeze(F(k,:,:));
end

虽然可能没有其他两种解决方案那么有效,但它是一种替代方案。试试上面的内容,看看会发生什么!