Sorting 对矩阵的主对角线排序

Sorting 对矩阵的主对角线排序,sorting,matrix,wolfram-mathematica,Sorting,Matrix,Wolfram Mathematica,我有一个矩阵,它在主对角线上的元素没有排序,所以我需要一个函数,它将返回主对角线上有排序元素的新矩阵。我不明白为什么这行不通 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,

我有一个矩阵,它在主对角线上的元素没有排序,所以我需要一个函数,它将返回主对角线上有排序元素的新矩阵。我不明白为什么这行不通

   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}}
当我运行它时,会显示以下内容:

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}在零件赋值中不是符号。>>

主要问题

  • 您不能定义自己的名为
    function
    的函数。(通常避免使用以大写字母开头的符号以避免冲突)
  • 您无法修改输入参数,因此请复制
  • 只需使用
    排序
    而不是
    选择排序
我还做了一些更具风格的其他更改:

  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]])