Как изменить форму матриц в Mathematica - PullRequest
14 голосов
/ 18 марта 2010

При манипулировании матрицами часто удобно менять их форму.Например, чтобы превратить матрицу размера N x M в вектор длиной NX M. В MATLAB существует функция reshape :

RESHAPE (X, M, N) возвращаетматрица M-by-N, элементы которой взяты по столбцам из X. Если X не содержит элементов M * N, возникает ошибка.

В случае преобразования матрицы и вектора я могу использоватьфункция Mathematica Flatten , которая использует преимущества представления Mathematica для вложенных списков матриц.В качестве быстрого примера предположим, что у меня есть матрица X:

4x4 matrix

С Flatten [X] я могу получить вектор {1,2,3,..., 16}.Но то, что было бы гораздо более полезным, это что-то похожее на применение reshape (X, 2,8) Matlab, что привело бы к следующей матрице:

4x4 matrix

Это позволило бы создавать произвольные матрицы при условии, что размеры равны N * M.Насколько я могу судить, нет ничего встроенного, что заставляет меня задуматься, не написал ли кто-нибудь свою функцию Reshape.

Ответы [ 5 ]

19 голосов
/ 18 марта 2010
Reshape[mtx_, _, n_] := Partition[Flatten[mtx], n]
11 голосов
/ 09 июля 2013

ArrayReshape делает именно это.

4 голосов
/ 05 мая 2012
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}}

Работает с массивами произвольной глубины.

3 голосов
/ 05 апреля 2012

Я знаю, что это старая тема, но ради архивов и поисков в 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}}}
0 голосов
/ 10 сентября 2017

Появилась также новая функция ArrayReshape [].

Пример:

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

ArrayReshape[{{1, 2, 3}, {4, 5, 6}}, {3, 2}] // MatrixForm
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...