[英]Transpose and reshape a 3d array in matlab
假設我有一個數組X,大小為n×p×q。 我想將其重塑為具有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,[])
因此,對於代碼驗證,您可以查看示例案例運行-
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
盡管可能沒有其他兩種解決方案有效,但它是替代方法。 嘗試以上操作,看看會發生什么!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.