公告:本站正式转型为非交互式静态网站!
转型:本站将通过笔记和博客的形式继续为大家服务,关于 Mathematica 问答服务请移步至QQ群:365716997
联系:如有问题请联系QQ群管理员,或发送邮件至:lixuan.xyz@qq.com。
感谢:最后非常感谢大家多年来的支持与帮助!
参考《互联网跟帖评论服务管理规定》《中华人民共和国网络安全法》《网络信息内容生态治理规定》《互联网用户账号信息管理规定》

—— 2022-11-27

欢迎来到 Mathematica 问答社区

提问时请贴上文本代码

语法高亮:在编辑器中点击

被禁止的话题:广告破解

请阅读:《提问的智慧》

备用域名:mma.ooo

支持LaTex数学公式
行内公式标识符:\$ 或“$\backslash ($”+“$\backslash )$”,
行间公式标识符:\$\$ 或 “$\backslash [$”+“$\backslash ]$”

社区建议QQ群:365716997

分类

0 投票
1.3k 浏览

希望能自定义一个函数,把任意一个若尔当矩阵按规则排序,规则如下,我知道Sort函数,可是那远远不行的

分类:函数 | 用户: mma-2-2-2 (1.3k 分)

2 个回答

+1 投票
 
已采纳
extractBDM[mat_?MatrixQ] := 
 Flatten[Last@
   Reap@NestWhile[
     Module[{pos}, 
       pos = FirstPosition[
         Table[Plus @@ (#[[i + 1, ;; i]] ~
              Join~#[[;; i, i + 1]])^2, {i, 1, Length@# - 1}], 0]; 
       If[MissingQ[pos], Sow[#]; {}, pos = pos[[1]]; 
        Sow[#[[;; pos, ;; pos]]]; #[[pos + 1 ;;, pos + 1 ;;]]]] &, 
     mat, # != {} &], 1]
     
buildBDM[{a_, b__}] := Fold[ArrayFlatten[{{#, 0}, {0, #2}}] &, a, {b}]

sortBDM[mat_?MatrixQ] := buildBDM@Sort@extractBDM@mat

(extractBDM有待改进)

测试:

SimilarQ[a_, b_] := 
 Equal @@ sortBDM@*Last@*JordanDecomposition /@ {a, b}
A = {{1, 1, 0, 0, 0}, {0, 1, 0, 0, 0}, {0, 0, 1, 1, 0}, {0, 0, 0, 1, 
    0}, {0, 0, 0, 0, 1}};
B = {{1, 0, 0, 0, 0}, {0, 1, 1, 0, 0}, {0, 0, 1, 0, 0}, {0, 0, 0, 1, 
    1}, {0, 0, 0, 0, 1}};
SimilarQ[A, B]

用户: happyfish (1.8k 分)
修改于 用户:happyfish
+1 投票
JordanSort[A_] := Module[{\[Lambda]list = Diagonal[A], f, Jordans},
  f[\[Lambda]_, 1] := {{\[Lambda]}};
  f[\[Lambda]_, n_] := 
   Normal@SparseArray[{Band[{1, 1}] -> \[Lambda], 
      Band[{1, 2}] -> 1}, {n, n}];
  Jordans = {\[Lambda]list[[#2]], #2 - #1} & @@@ 
     Partition[Flatten[{0, Position[Diagonal[A, 1], 0], Length@A}], 2,
       1] // Sort;
  Normal@SparseArray[{Band[{1, 1}] -> f @@@ Jordans}]
]

测试

A = DiagonalMatrix[{2, 3, 3, 3, 3, 3, 1}] + 
DiagonalMatrix[{0, 1, 0, 1, 1, 0}, 1];
MatrixForm /@ {A, JordanSort@A}

用户: 无影东瓜 (1.2k 分)
...