使用Mathematica自动显示矩阵结构

我花了很多时间研究通常具有某种结构的较大矩阵(10×10,20×20等),但随着它们变大,很难快速确定它们的结构.理想情况下,我希望让Mathematica自动生成一些矩阵表示,以突出其结构.例如,

(A = {{1, 2 + 3 I}, {2 - 3 I, 4}}) // StructureForm

会给

{{a, b}, {Conjugate[b], c}}

甚至

{{a, b + c I}, {b - c I, d}}

是可以接受的一个有点天真的实现

StructureForm[M_?MatrixQ] := 
  MatrixForm @ Module[
    {pos, chars},
    pos = Reap[
           Map[Sow[Position[M, #1], #1] &, M, {2}], _, 
           Union[Flatten[#2, 1]] &
          ][[2]];  (* establishes equality relationship *)
    chars = CharacterRange["a", "z"][[;; Length @ pos ]];
    SparseArray[Flatten[Thread /@ Thread[pos -> chars] ], Dimensions[M]]
  ]

仅适用于实数数字矩阵,例如

StructureForm @ {{1, 2}, {2, 3}} == {{a, b}, {b, c}}

显然,我需要定义我认为可能存在的关系(相等,否定,共轭,否定共轭等),但我不确定如何确定这些关系存在,至少以一种干净的方式存在.而且,一旦我有了关系,下一个问题是如何确定哪个是最简单的,在某种意义上?有什么想法吗?

我想到的一种可能性是,每对元素生成一个与其位置相关的三元组,如上面的A {{1,2},Conjugate,{2,1}},然后它变得适合图形算法.

编辑:顺便提一下,我的灵感来自Stewart的Matrix Algorithms系列(1,2).

我们可以从定义我们想要识别的关系开始:

ClearAll@relationship
relationship[a_ -> sA_, b_ -> sB_] /; b == a := b -> sA
relationship[a_ -> sA_, b_ -> sB_] /; b == -a := b -> -sA
relationship[a_ -> sA_, b_ -> sB_] /; b == Conjugate[a] := b -> SuperStar[sA]
relationship[a_ -> sA_, b_ -> sB_] /; b == -Conjugate[a] := b -> -SuperStar[sA]
relationship[_, _] := Sequence[]

表达这些关系的形式便于structureForm的定义:

ClearAll@structureForm
structureForm[matrix_?MatrixQ] :=
  Module[{values, rules, pairs, inferences}
  , values = matrix // Flatten // DeleteDuplicates
  ; rules = Thread[Rule[values, CharacterRange["a", "z"][[;; Length@values]]]]
  ; pairs = rules[[#]]& /@ Select[Tuples[Range[Length@values], 2], #[[1]] < #[[2]]&]
  ; inferences = relationship @@@ pairs
  ; matrix /. inferences ~Join~ rules
  ]

简而言之,只要一对与定义的关系匹配,此函数就会检查矩阵中每个可能的值对,从而推断替换规则.注意关系定义如何用表格值中的替换规则对表示 – >名称.矩阵值分配有字母名称,从左到右,从上到下.假设在相同顺序中具有优先级,则忽略冗余推断关系.

请注意,在找到26个不同的值后,该函数将耗尽名称 – 如果这是一个问题,则需要使用备用名称分配策略.此外,名称表示为字符串而不是符号.这可以方便地避开单字母符号名称的任何不需要的绑定.如果首选符号,则将符号函数应用于每个名称将是微不足道的.

以下是该函数的一些示例用法:

In[31]:= structureForm @ {{1, 2 + 3 I}, {2 - 3 I, 4}}

Out[31]= {{"a", "b"}, {SuperStar["b"], "d"}}

In[32]:= $m = a + b I /. a | b :> RandomInteger[{-2, 2}, {10, 10}];
         $m // MatrixForm
         $m // structureForm // MatrixForm
相关文章
相关标签/搜索