【问题标题】:How to reshape matrices in Mathematica如何在 Mathematica 中重塑矩阵
【发布时间】:2010-03-18 06:42:48
【问题描述】:

在处理矩阵时,改变它们的形状通常很方便。例如,要将 N x M 大小的矩阵转换为长度为 N X M 的向量。在 MATLAB 中存在 reshape 函数:

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

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

使用 Flatten[X] 我可以得到向量 {1,2,3,...,16}。但更有用的是类似于应用 Matlab 的 reshape(X,2,8) 会产生以下矩阵:

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

【问题讨论】:

    标签: wolfram-mathematica


    【解决方案1】:
    Reshape[mtx_, _, n_] := Partition[Flatten[mtx], n]
    

    【讨论】:

      【解决方案2】:

      ArrayReshape 正是这样做的。

      【讨论】:

      • 请注意,在提出问题时这不可用,但可能是今天的最佳答案..(版本 9 中的新功能)
      • @george 是的;这符合网站推广自适应答案的精神!
      【解决方案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】:

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

        【讨论】:

        • 如何按列重塑?即元素垂直向下然后移动到下一列?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多