2013-06-24 70 views
6

在Matlab中,我們可以在這樣的一個數組的維崩潰:如何在一組特定的維度上摺疊數組?

M  = rand(3,4,5); 
myvec = M(:);  % gives a 60-element vector 

我想這就是所謂的連載或壓扁。元素的順序先是dim1,然後是dim2,然後是dim3 - 所以你得到[M(1,1,1); M(2,1,1); M(3,1,1); M(1,2,1); ...]

但我想要做的就是崩潰只是沿着前兩個維度:

mymatrix = M(:: , :); % something that works like this? 

給一個12×5矩陣。因此,舉例來說,你

[M(1,1,1) M(1,1,2) M(1,1,3) M(1,1,4) M(1,1,5) 
M(2,1,1) M(2,1,2) M(2,1,3) M(2,1,4) M(2,1,5) 
M(3,1,1) M(3,1,2) M(3,1,3) M(3,1,4) M(3,1,5) 
M(1,2,1) M(1,2,2) M(1,2,3) M(1,2,4) M(1,2,5) 
... 
] 

這樣的mymatrix第一個維度是「扁平化」 1號和原M的第二個維度,但保留任何其他尺寸。

我實際上需要爲5維數組的「中間3維」做這件事,所以一個通用的解決方案將非常棒!例如如果你明白我的意思,W=rand(N,N,N,N,N); mymatrix = W(:, :::, :)應該給出N x N^3 x N矩陣。

由於

回答

5

使用reshape用方括號([])作爲的尺寸長度參數之一的佔位符:

sz = size(M); 
mymatrix = reshape(M, [], sz(end));  % # Collapse first two dimensions 

mymatrix = reshape(M, sz(1), [], sz(end)); % # Collapse middle dimensions 

佔位符[]告訴reshape計算大小自動。請注意,您只能使用一次[]。所有其他尺寸長度必須明確指定。

+0

非常感謝!應該考慮重塑。 PS我只是想到另一種看似工作的方式:'tmp = permute(M,[1,5,2,3,4]);','mymatrix = tmp(:,:)'。不知道它會一直工作嗎?當然''重塑'是**更加可取的。 –

相關問題