ある期間にわたるグリッドの測定値をn-by-m-by-t
表すMATLABの3d行列( )があります。n-by-m
空間情報がなくなり、n*m
時間の経過に伴う測定値のみが残る2Dマトリックスが必要ですt
(例:)n*m-by-t
これどうやってするの?
次のコマンドが必要ですreshape
:
あなたの最初の行列が(私がいくつかのデータを取得するためだけに)であるとしましょう:
a=rand(4,6,8);
次に、最後の2つの座標が空間的である場合(時間は4、mは6、nは8)、次を使用します。
a=reshape(a,[4 48]);
最終的には4x48アレイになります。
最初の2つが空間で、最後が時間(mは4、nは6、時間は8)の場合、次を使用します。
a=reshape(a,[24 8]);
そして、24x8のアレイになります。
これは高速なO(1)操作です(データの形状のヘッダーを調整するだけです)。それを行う他の方法があります。たとえばa=a(:,:)
、最後の2つの次元を凝縮する方法ですが、形状の変更はより高速です。
もちろん、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という関数をMATLABCentral交換に配置しました。
もちろん、あなたはいつでも次のようなトリックを使うことができます
B = A(:);
行列から直接ベクトルを作成します。これはフォームと同等です
B=reshape(A,[],1);
この問題のより良い解決策は、RasmusBroのN-WayToolboxから入手できるnshape.mを使用することです。これにより、特定のモードに沿って形状を変更できます。これは、reshapeコマンドでは少し注意が必要です。
ツールボックスは、次のリンクから入手できます。
https://www.mathworks.com/matlabcentral/fileexchange/1088-the-n-way-toolbox
配列操作に役立つ他の優れたツールもいくつかあります。