14

行列を操作する場合、形状を変更すると便利なことがよくあります。たとえば、N x M サイズの行列を長さ NX M のベクトルに変換するには、MATLAB にはreshape関数が存在します。

RESHAPE(X,M,N) は、要素が X から列方向に取得される M 行 N 列の行列を返します。X に M*N 要素がない場合は、エラーが発生します。

行列とベクトルの間の変換の場合、Mathematica 関数Flattenを使用できます。これは、Mathematica のネストされた行列表現を利用しています。簡単な例として、行列 X があるとします。

4x4 マトリックス

Flatten [X] を使用すると、ベクトル {1,2,3,...,16} を取得できます。しかし、Matlab のreshape (X,2,8)を適用するのに似たものの方がはるかに便利で、結果として次の Matrix が得られます。

4x4 マトリックス

これにより、次元が N*M に等しい限り、任意の行列を作成できます。私が知る限り、誰かが独自の Reshape 関数をコーディングしていないのではないかと思わせるようなものは何も組み込まれていません。

4

5 に答える 5

20
Reshape[mtx_, _, n_] := Partition[Flatten[mtx], n]
于 2010-03-18T06:53:18.647 に答える
5
Reshape[list_, dimensions_] := 
First[Fold[Partition[#1, #2] &, Flatten[list], Reverse[dimensions]]]

使用例:

In: Reshape[{1,2,3,4,5,6},{2,3}]

Out: {{1,2,3},{4,5,6}}

これは、任意の深さの配列で機能します。

于 2012-05-04T20:43:44.510 に答える
3

これが古いスレッドであることは知っていますが、アーカイブとGoogle検索のために、長さm * n * ...リストをm * n * ...配列に変換できるより一般的な方法があります:

Reshape[list_, shape__] := Module[{i = 1},
  NestWhile[Partition[#, shape[[i]]] &, list, ++i <= Length[shape] &]
  ]

例えば:

In:= Reshape[Range[8], {2, 2, 2}]

Out:= {{{1, 2}, {3, 4}}, {{5, 6}, {7, 8}}}
于 2012-04-05T13:13:46.467 に答える