如何在Mathematica中重新塑造矩阵

14

在操作矩阵时,通常需要改变它们的形状。例如,将一个N x M大小的矩阵转换为长度为 N X M 的向量。在 MATLAB 中存在一个 reshape 函数:

RESHAPE(X,M,N) 返回其元素按列顺序从 X 中取出所得的 M-乘-N 矩阵。如果 X 没有 M*N 个元素,则会发生错误。

在转换矩阵和向量之间的情况下,可以使用 Mathematica 函数 Flatten,该函数利用了 Mathematica 对矩阵的嵌套列表表示。例如,假设有一个矩阵 X:

4x4 matrix

通过 Flatten[X] 可以得到向量 {1,2,3,...,16}。但更有用的是类似于应用 Matlab 的 reshape(X,2,8) 的东西,这将导致以下矩阵:

4x4 matrix

这将允许创建任意矩阵,只要维度等于 N*M。据我所知,没有内置的函数可以实现这一点,这让我想知道是否有人编写了自己的 Reshape 函数。

5个回答

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

13

1
注意:此功能在版本9中新增,可能是目前最佳答案。 - agentp
@george 是的;这是推广适应性答案网站精神的体现! - Matthias Odisio

5
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

我知道这是一个旧的帖子,但为了存档和谷歌搜索的缘故,我有一种更通用的方法,可以将长度为 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}}}

注意:此解决方案转置了最后两个维度,因此不太适用。 - Guillochon

0
现在还有一个新的函数ArrayReshape[]。
例子:
{{1, 2, 3}, {4, 5, 6}} // MatrixForm

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

如何按列重新塑形?即,元素向下垂直移动,然后进入下一列? - Chen Stats Yu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接