2010-02-13 169 views
23

在MATLAB中,我有一個3d矩陣(n-by-m-by-t),表示在一段時間內網格中的測量值爲n-by-m。我想有一個2d矩陣,其中空間信息已消失,只剩下n*m隨着時間的推移t(即:n*m-by-t將3d矩陣重塑爲2d矩陣

我該怎麼做?

回答

28

您需要的命令reshape

說你的初始矩陣(只是讓我得到一些數據):

a=rand(4,6,8); 

然後,如果最後兩個座標是空間(時間爲4, m是6,n是8)您使用:

a=reshape(a,[4 48]); 

並且您最終得到一個4x48陣列。

如果前兩個是空間和上次時間(m爲4,n爲6,時間8)使用:

a=reshape(a,[24 8]); 

和你結束了一個24x8陣列。

這是一個快速的O(1)操作(它只是調整它的數據形狀的標題)。還有其他的方法可以做到,例如a=a(:,:)來壓縮最後的兩個維度,但重塑更快。

11

重塑當然是整形數組的重要標準解決方案。 (他們還會稱之爲什麼?)還有一些技巧可以發現。

首先,將大小爲[n,m,p]的數組轉換爲大小爲[n * m,p]的數組的最簡單方法?

B = reshape(A,n*m,p); 

不過還好是這樣的:

B = reshape(A,[],p); 

如果你離開的理由之一重塑空,那麼重塑計算尺寸爲您服務!要小心,如果你嘗試這個,並且A的大小不符合,那麼你會得到一個錯誤。因此:

reshape(magic(3),[],2) 
??? Error using ==> reshape 
Product of known dimensions, 2, not divisible into total number of elements, 9. 

從邏輯上說,我們不能創建一個有兩列的數組,其中有9個元素。我確實在MATLAB Central交換機上放了一個名爲wreshape的函數,它可以根據需要進行填充,以執行此操作而不會產生錯誤。

當然,你總是可以使用的技巧,比如

B = A(:); 

直接從矩陣創建矢量。這相當於形式

B=reshape(A,[],1);