2010-03-18 8 views
12

Lors de la manipulation de matrices, il est souvent pratique de changer leur forme. Par exemple, pour transformer une N x M matrice de taille dans un vecteur de longueur NX M. Dans un Matlab Reshape fonction existe:Comment remodeler des matrices dans Mathematica

RESHAPE (X, M, N) retourne la matrice M par N dont les éléments sont pris dans la colonne à partir de X. Une erreur se produit si X n'a ​​pas d'éléments M * N.

Dans le cas d'une conversion entre une matrice et un vecteur je peux utiliser la fonction Mathematica Platten qui tire avantage de la représentation de liste imbriquée de Mathematica pour les matrices. A titre d'exemple rapide, supposons que j'ai une matrice X:

4x4 matrix

Avec Aplatir [X] Je peux obtenir le vecteur {1,2,3, ..., 16}. Mais ce qui serait bien plus utile est quelque chose de semblable à l'application Reshape de Matlab (X, 2,8) qui se traduirait par la matrice suivante:

4x4 matrix

Cela permettrait la création de matrices arbitraires tant que les dimensions sont égales à N * M. Pour autant que je sache, il n'y a rien de construit dans lequel je me demande si quelqu'un n'a pas codé une fonction Reshape de leur choix.

Répondre

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

Je sais que c'est un vieux fil, mais pour le bien des archives et recherches Google J'ai une façon plus générale qui permet une longueur m * n * ... liste pour être transformé en un m * n * ... tableau:

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

Par exemple:

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

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

Note: Cette solution transpose les deux dernières dimensions, il ne fonctionne pas tout à fait. – Guillochon

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

Exemple d'utilisation:

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

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

Cela fonctionne avec des tableaux de profondeur arbitraire.

10

ArrayReshape fait exactement cela.

+0

noter que ce n'était pas disponible lorsque la question a été posée, mais est probablement la meilleure réponse aujourd'hui .. (nouveau dans la version 9) – agentp

+0

@george oui; c'est dans l'esprit du site de promouvoir des réponses adaptatives! –

0

Il existe maintenant une nouvelle fonction ArrayReshape [].

Exemple:

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

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

comment est-ce que je remodèle par colonne? c'est-à-dire que les éléments descendent verticalement puis passent à la colonne suivante? –