簡體   English   中英

在Matlab中轉置和重塑3D數組

[英]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=2p=3q=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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM