假设我有一个大小为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
有更快的方法吗?
答案 0 :(得分:2)
我认为这就是你想要的:
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
答案 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
虽然可能没有其他两种解决方案那么有效,但它是一种替代方案。试试上面的内容,看看会发生什么!