一定期間のグリッド内のn-by-m-by-t
の測定値を表す3Dマトリックス(n-by-m
)がMATLABにあります。空間情報がなくなり、時間の経過に伴うn*m
測定値t
のみが残る2Dマトリックスが必要です(つまり:n*m-by-t
)
これどうやってするの?
コマンド 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つの次元を圧縮しますが、形状変更の方が高速です。
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);
この問題のより良い解決策は、Rasmus BroのN-Way Toolboxから入手可能なnshape.mを使用することです。これにより、指定されたモードに沿って形状を変更できます。これは、reshapeコマンドで少しトリッキーです。
ツールボックスは次のリンクから入手できます。
https://www.mathworks.com/matlabcentral/fileexchange/1088-the-n-way-toolbox
配列操作にも役立つ優れたツールが他にもいくつかあります。