2010-03-18 25 views
12

Bei der Bearbeitung von Matrizen ist es oft praktisch, ihre Form zu ändern. Zum Beispiel kann eine N x M Matrix Größe in einen Vektor der Länge NX M. In MATLAB einzuschalten a reshape Funktion existiert:Umformen von Matrizen in Mathematica

RESHAPE (X, M, N) liefert die M-mal-N-Matrix deren Elemente spaltenweise aus X genommen werden. Ein Fehler tritt auf, wenn X keine M * N Elemente hat.

Im Fall zwischen einer Matrix und Vektor-Umwandlung kann ich die Funktion Mathematica Flatten verwenden, die für Matrizen Vorteil Mathematicas verschachtelter Liste Darstellung erfolgt. Als kleines Beispiel, nehme ich an eine Matrix X:

4x4 matrix

Mit Flatten [X] ich den Vektor bekommen {1,2,3, ..., 16}. Aber was viel nützlicher wäre ist so etwas wie Matlab Anwendung reshape (X, 2,8), die in der folgenden Matrix führen würde:

4x4 matrix

Diese Schaffung beliebiger Matrizen erlauben würde, solange die Dimensionen sind gleich N * M. Soweit ich das beurteilen kann, gibt es nichts, was mich dazu bringt, mich zu fragen, ob jemand eine eigene Umformfunktion programmiert hat.

Antwort

18
Reshape[mtx_, _, n_] := Partition[Flatten[mtx], n] 
3

Ich weiß, dass dies ein alter Thread ist aber aus Gründen der Archive und sucht google Ich habe eine allgemeinere Art und Weise bekam, der eine Länge m * erlaubt n * ... Liste in eine m gedreht werden * n * ... Array:

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

Eg:

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

Out:= {{{1, 2}, {3, 4}}, {{5, 6}, {7, 8}}} 
+0

Hinweis: Diese Lösung transponiert die letzten zwei Dimensionen, so dass es nicht ganz funktioniert. – Guillochon

4
Reshape[list_, dimensions_] := 
First[Fold[Partition[#1, #2] &, Flatten[list], Reverse[dimensions]]] 

Verwendungsbeispiel:

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

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

Dies funktioniert mit Arrays beliebiger Tiefe.

10

ArrayReshape tut genau das.

+0

Beachten Sie, dass dies nicht verfügbar war, wenn die Frage gestellt wurde, aber es ist wahrscheinlich die beste Antwort heute .. (neu in Version 9) – agentp

+0

@george yes; Das ist im Geiste der Website, um adaptive Antworten zu fördern! –

0

Es gibt jetzt auch eine neue Funktion ArrayReshape [].

Beispiel:

{{1, 2, 3}, {4, 5, 6}} // MatrixForm 

ArrayReshape[{{1, 2, 3}, {4, 5, 6}}, {3, 2}] // MatrixForm 
+0

Wie kann ich nach Spalten umformen? d.h. Elemente gehen vertikal nach unten und dann in die nächste Spalte? –