在MATLAB中,我有一個3d矩陣(n-by-m-by-t
),表示在一段時間內網格中的測量值爲n-by-m
。我想有一個2d矩陣,其中空間信息已消失,只剩下n*m
隨着時間的推移t
(即:n*m-by-t
)將3d矩陣重塑爲2d矩陣
我該怎麼做?
在MATLAB中,我有一個3d矩陣(n-by-m-by-t
),表示在一段時間內網格中的測量值爲n-by-m
。我想有一個2d矩陣,其中空間信息已消失,只剩下n*m
隨着時間的推移t
(即:n*m-by-t
)將3d矩陣重塑爲2d矩陣
我該怎麼做?
您需要的命令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(:,:)
來壓縮最後的兩個維度,但重塑更快。
重塑當然是整形數組的重要標準解決方案。 (他們還會稱之爲什麼?)還有一些技巧可以發現。
首先,將大小爲[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);
一個更好的解決這個問題是使用可從拉斯穆斯兄弟的N路工具箱nshape.m。這將允許您沿着給定的模式重新塑形,這對於重塑命令來說有點棘手。
工具箱可在以下鏈接:
https://www.mathworks.com/matlabcentral/fileexchange/1088-the-n-way-toolbox
還有有一些其他優秀的工具來幫助數組操作爲好。