2010-03-18 146 views
12

操纵矩阵时,通常很方便更改其形状。例如,为了把一个N×M的矩阵尺寸成NX长度M的向量在MATLAB一个重塑函数存在:如何在Mathematica中重塑矩阵

RESHAPE(X,M,N)返回m乘N矩阵其元素从X开始按列显示。如果X没有M * N个元素,则会出现错误。

在矩阵和矢量I可以使用数学函数平铺这需要Mathematica的用于矩阵嵌套列表表示的优点之间进行转换的情况下。作为一个简单的例子,假设我有一个矩阵X:随着平铺 [X]

4x4 matrix

我可以得到矢量{1,2,3,...,16}。但是,这将是更为有用的是一个类似于应用Matlab的重塑(X,2,8),这将导致以下矩阵:

4x4 matrix

这将允许任意矩阵的创建只要尺寸等于N * M。据我所知,没有任何内容可以让我怀疑是否有人没有编写自己的Reshape函数。

回答

18
Reshape[mtx_, _, n_] := Partition[Flatten[mtx], n] 
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}}} 
+0

注意:此方法调换最后两个维度,所以它不是做得比较工作。 – Guillochon 2012-06-11 00:57:01

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

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

10

ArrayReshape正是这么做的。

+0

注意这个问题没有问,但今天可能是最好的答案..(新版本9) – agentp 2013-07-09 20:26:07

+0

@george yes;这是在网站的精神,以促进适应性答案! – 2013-07-09 23:50:38

0

现在已经开始了新的功能ArrayReshape []。

例子:

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

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

如何按列重新塑形?即元素垂直向下,然后移动到下一列? – 2017-10-31 18:39:00