Подтвердить что ты не робот

Как изменить матрицу в Mathematica

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

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

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

4x4 matrix

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

4x4 matrix

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

4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

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}}

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

Ответ 4

Я знаю, что это старый поток, но для архивов и поиска в 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}}}

Ответ 5

Теперь появилась новая функция ArrayReshape [].

Пример:

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

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