Performance 在matlab中对三维阵列进行转置和整形
假设我有一个大小为n×p×q的数组X。我想把它重塑成一个有p行的矩阵,在每一行中把大小为q的n行串联起来,得到大小为p乘以nq的矩阵 我试着用一个循环来做,但是如果n=1000,p=300,q=300,需要一段时间Performance 在matlab中对三维阵列进行转置和整形,performance,matlab,multidimensional-array,vectorization,Performance,Matlab,Multidimensional Array,Vectorization,假设我有一个大小为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,
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
我想这就是你想要的:
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,[])
因此,对于代码验证,可以查看示例运行情况-
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
试试这个-
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
您不必使用矢量化来解决问题,而是可以查看代码来尝试找出可以提高性能的方法。在这种情况下,由于您知道输出矩阵
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
虽然可能没有其他两种解决方案那么有效,但它是一种替代方案。试试上面的方法,看看会发生什么 不必使用矢量化来解决问题,您可以查看代码来尝试找出可以提高性能的方法。在这种情况下,由于您知道输出矩阵
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
虽然可能没有其他两种解决方案那么有效,但它是一种替代方案。试试上面的方法,看看会发生什么 你不需要另一个
[1 3 2]
?@Divakar-Hmm。。。实际上,我不知道OP想要什么。@Divakar谢谢!你已经有了我的+1来深入研究这个问题。我想有两种可能的方法来线性化剩下的两个维度,我们的答案不同,那就是你不需要另一个[1 3 2]
?@Divakar-Hmm。。。实际上,我不知道OP想要什么。@Divakar谢谢!你已经有了我的+1来深入研究这个问题。我想有两种可能的方法来线性化剩下的两个维度,我们的答案在这方面有所不同