转置和重塑一个三维数组在matlab中



假设我有一个大小为n × p × q的数组X,我想把它重塑成一个有p行的矩阵,在每一行中放置大小为q的n行的连接,从而得到一个大小为p × nq的矩阵。

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

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

有更快的方法吗?

我想这就是你想要的:

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

n=2, p=3, q=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

试试这个-

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

因此,对于代码验证,可以查看示例情况run -

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

与其使用向量化来解决问题,还不如查看代码,尝试找出可以提高性能的方法。在本例中,由于您知道输出矩阵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

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

相关内容

  • 没有找到相关文章

最新更新