Wolfram mathematica 如何在Mathematica中重塑矩阵

Wolfram mathematica 如何在Mathematica中重塑矩阵,wolfram-mathematica,Wolfram Mathematica,在操纵矩阵时,通常可以方便地更改其形状。例如,要将一个N x M大小的矩阵转换为长度为N x M的向量,在MATLAB中存在一个重塑函数: 重塑(X,M,N)返回M-by-N矩阵,其元素从X按列获取。如果X没有M*N元素,则会导致错误 在矩阵和向量之间转换的情况下,我可以使用Mathematica函数展平,它利用Mathematica的矩阵嵌套列表表示法。举个简单的例子,假设我有一个矩阵X: 用展平[X]我可以得到向量{1,2,3,…,16}。但更有用的是类似于应用Matlab的重塑(X,2,

在操纵矩阵时,通常可以方便地更改其形状。例如,要将一个N x M大小的矩阵转换为长度为N x M的向量,在MATLAB中存在一个重塑函数:

重塑(X,M,N)返回M-by-N矩阵,其元素从X按列获取。如果X没有M*N元素,则会导致错误

在矩阵和向量之间转换的情况下,我可以使用Mathematica函数展平,它利用Mathematica的矩阵嵌套列表表示法。举个简单的例子,假设我有一个矩阵X:

用展平[X]我可以得到向量{1,2,3,…,16}。但更有用的是类似于应用Matlab的重塑(X,2,8)的方法,这将产生以下矩阵:


这将允许创建任意矩阵,只要维数等于N*M。据我所知,没有任何内置的东西让我怀疑是否有人没有编写出他们自己的重塑函数。

我知道这是一个旧线程,但为了存档和谷歌搜索,我有一个更通用的方法,允许长度为m*n*。。。要转换为m*n*…的列表。。。数组:

Reshape[mtx_, _, n_] := Partition[Flatten[mtx], n]
Reshape[list_, shape__] := Module[{i = 1},
  NestWhile[Partition[#, shape[[i]]] &, list, ++i <= Length[shape] &]
  ]
用法示例:

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

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

这适用于任意深度的数组。

正是这样做的。

现在还有一个新函数ArrayReshape[]

例如:

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

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

注意:此解决方案转换了最后两个维度,因此不太有效。请注意,当提出问题时,此解决方案不可用,但可能是今天的最佳答案。。(第9版新增)@georgeyes;这是该网站推广适应性答案的精神所在!如何按列重塑形状?i、 元素垂直向下移动到下一列?
In: Reshape[{1,2,3,4,5,6},{2,3}]

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

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