【问题标题】:Sorting the main diagonal of a matrix对矩阵的主对角线进行排序
【发布时间】:2015-04-11 00:12:01
【问题描述】:

我有一个矩阵,它在主对角线上的元素没有排序,所以我需要一个函数来返回新矩阵,其中主对角线上的元素是排序的。我不明白为什么这不起作用。

   Function[A_] := Module[{res, diagonal = {}, m, n},
   {m, n} = Dimensions[A];
   Table[AppendTo[diagonal, A[[i, i]]], {i, 1, m}];
   dijagonal = SelectionSort[diagonal];
   Table[A[[i, i]] = dijagonal[[i]], {i, 1, m}];
   Return[A // MatrixForm];
   ];

选择排序有效。

这可以是一个矩阵的例子:

   A={{60, 10, 68, 72, 64},{26, 70, 32, 19, 29},{94, 78, 86, 59, 17},
 {77, 13, 34, 39, 0}, {31, 71, 11, 48, 83}}

当我运行它时,它会显示:

Set::setps: {{60,10,68,72,64},{26,70,32,19,29},{94,78,86,59,17},{77,13,部分赋值中的 34,39,0},{31,71,11,48,83}} 不是符号。 >>

【问题讨论】:

    标签: sorting matrix wolfram-mathematica


    【解决方案1】:

    主要问题

    • 您不能定义自己的名为Function 的函数。 (一般避免使用任何以大写开头的符号以避免冲突)
    • 你不能修改输入参数,所以复制一个
    • 只使用Sort 而不是SelectionSort

    我还进行了其他一些更具风格的更改:

      function[A0_] :=
         Module[{res, diagonal = {}, m, n, A = A0},
         {m, n} = Dimensions[A];
         diagonal = Table[A[[i, i]], {i, 1, m}];
         dijagonal = Sort[diagonal];
         Do[A[[i, i]] = dijagonal[[i]], {i, 1, m}]; A]
    
     function[A] // MatrixForm
    

    请注意,您可以内联完成所有这些操作:

     ReplacePart[ A, 
          Table[ {i, i} -> (Sort@Diagonal[A])[[i]], {i, Length@A} ]]
    

     (A + DiagonalMatrix[Sort@# - # &@Diagonal[A]]) 
    

    【讨论】:

      猜你喜欢
      • 2012-08-17
      • 2016-07-22
      • 2021-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-04
      • 1970-01-01
      相关资源
      最近更新 更多