web-dev-qa-db-ja.com

3Dマトリックスを2Dマトリックスに変形

一定期間のグリッド内のn-by-m-by-tの測定値を表す3Dマトリックス(n-by-m)がMATLABにあります。空間情報がなくなり、時間の経過に伴うn*m測定値tのみが残る2Dマトリックスが必要です(つまり:n*m-by-t

これどうやってするの?

23
Peter Smit

コマンド reshape が必要です:

あなたの最初の行列が(私がいくつかのデータを取得するためだけに)あるとしましょう:

_a=Rand(4,6,8);
_

次に、最後の2つの座標が空間(時間は4、mは6、nは8)の場合、次のように使用します。

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

そして、4x48アレイになります。

最初の2つが空間的で、最後の2つが時間である場合(mは4、nは6、時間は8)、次を使用します。

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

そして、24x8の配列になります。

これは高速なO(1)操作です(データの形状のヘッダーを調整するだけです)。これを行うには他の方法があります。たとえば、a=a(:,:)最後の2つの次元を圧縮しますが、形状変更の方が高速です。

28
Ramashalanka

Reshapeはもちろん、配列を再形成するための標準的な解決策です。 (彼らはそれを他に何と呼びますか?)まだ明らかにするいくつかのトリックがあります。

まず、サイズ[n、m、p]の配列をサイズ[n * m、p]の配列に変換する最も簡単な方法は何ですか?

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

しかし、これはより良いです:

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

Reshapeの引数の1つを空のままにすると、reshapeがサイズを計算します。これを試してAのサイズが適合しない場合は、エラーが発生するので注意してください。したがって:

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

論理的には、9つの要素を持つものから2つの列を含む配列を作成することはできません。エラーを生成せずにこの操作を行うために必要に応じてパディングする wreshape という関数をMATLAB Central交換に配置しました。

もちろん、いつでも次のようなトリックを使用できます

B = A(:);

行列から直接ベクトルを作成します。これは次の形式と同等です

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

この問題のより良い解決策は、Rasmus BroのN-Way Toolboxから入手可能なnshape.mを使用することです。これにより、指定されたモードに沿って形状を変更できます。これは、reshapeコマンドで少しトリッキーです。

ツールボックスは次のリンクから入手できます。

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

配列操作にも役立つ優れたツールが他にもいくつかあります。

1
user3014616