假设我有一个大小为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
虽然可能不如其他两种解决方案有效,但它是一种替代方案。试试上面的方法,看看会发生什么!