Ответ 1
Reshape[mtx_, _, n_] := Partition[Flatten[mtx], n]
При манипулировании матрицами часто бывает удобно менять свою форму. Например, чтобы преобразовать матрицу размера N x M в вектор длины N X M. В MATLAB существует функция изменения:
RESHAPE (X, M, N) возвращает матрицу M-by-N, элементы которой берутся по столбцам из X. Ошибка возникает, если X не содержит элементов M * N.
В случае преобразования между матрицей и вектором я могу использовать функцию Mathematica Flatten, которая использует математическое представление Mathematica для матриц. В качестве быстрого примера предположим, что у меня есть матрица X:
С Flatten [X] я могу получить вектор {1,2,3,..., 16}. Но что было бы гораздо полезнее, это нечто похожее на применение Matlab reshape (X, 2,8), которое приведет к следующей матрице:
Это позволило бы создать произвольные матрицы, если бы размеры равны N * M. Насколько я могу судить, нет ничего, что заставило бы меня задуматься, не кто-то не закодировал собственную функцию Решайпа.
Reshape[mtx_, _, n_] := Partition[Flatten[mtx], n]
ArrayReshape делает именно это.
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}}
Это работает с массивами произвольной глубины.
Я знаю, что это старый поток, но для архивов и поиска в 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}}}
Теперь появилась новая функция ArrayReshape [].
Пример:
{{1, 2, 3}, {4, 5, 6}} // MatrixForm
ArrayReshape[{{1, 2, 3}, {4, 5, 6}}, {3, 2}] // MatrixForm