簡體   English   中英

將3d矩陣重塑為2d矩陣

[英]Reshape 3d matrix to 2d matrix

我在MATLAB中有一個3d矩陣( n-by-m-by-t )表示在一段時間內網格中的n-by-m測量。 我想有一個2d矩陣,其中空間信息消失了,只留下了時間t n*m測量值(即: n*m-by-t

我怎樣才能做到這一點?

你需要命令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);

解決這個問題的一個更好的方法是使用Rasmus Bro的N-Way Toolbox提供的nshape.m. 這將允許您沿着給定模式重塑,這對於reshape命令來說有點棘手。

工具箱可從以下鏈接獲得:

https://www.mathworks.com/matlabcentral/fileexchange/1088-the-n-way-toolbox

還有一些其他優秀的工具可以幫助進行數組操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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