Matrix 用Mathematica自动揭示矩阵结构

Matrix 用Mathematica自动揭示矩阵结构,matrix,wolfram-mathematica,Matrix,Wolfram Mathematica,我花了很多时间研究较大的矩阵(10x10、20x20等),它们通常有一些结构,但随着它们变大,很难快速确定它们的结构。理想情况下,我想让Mathematica自动生成一些矩阵表示,以突出显示其结构。比如说, (A = {{1, 2 + 3 I}, {2 - 3 I, 4}}) // StructureForm 会给 {{a, b}, {Conjugate[b], c}} 甚至 {{a, b + c I}, {b - c I, d}} 这是可以接受的。有点幼稚的实现 StructureFor

我花了很多时间研究较大的矩阵(10x10、20x20等),它们通常有一些结构,但随着它们变大,很难快速确定它们的结构。理想情况下,我想让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}}
显然,我需要定义我认为可能存在的关系(相等、否定、共轭、否定共轭等),但我不确定如何确定这些关系存在,至少以干净的方式存在。一旦我有了这些关系,下一个问题是,从某种意义上说,如何确定哪一个是最简单的?有什么想法吗

想到的一种可能性是,对于每一对元素,生成一个与其位置相关的三元组,如上面的
{1,2},共轭,{2,1}}
对于
a
,然后它就可以使用图算法了


编辑:顺便提一下,我的灵感来自Stewart的矩阵算法系列(,)。

你试过看特征值吗?特征值揭示了矩阵结构和对称性的大量信息,是数据集统计分析的标准。例如

  • 厄米特/对称特征值 实特征值
  • 半正定矩阵 非负特征值,反之亦然
  • 旋转矩阵具有复特征值
  • 循环矩阵的特征值是简单的。循环矩阵的优点在于每个循环矩阵都有相同的特征向量集。在某些情况下,这些结果(循环)可以推广到Toeplitz矩阵
  • 如果你处理的矩阵是随机的(实验观测可以被建模为随机矩阵),你也可以阅读,它将特征值的分布与矩阵中的基本对称性和元素的统计分布联系起来。具体来说,

  • 对称/厄米-高斯矩阵的特征值分布为[半圆]
  • Wishart矩阵的特征值分布(如果
    A
    是随机高斯矩阵,
    W=AA'
    是Wishart矩阵)由
  • 此外,特征值之间的差异(间距)也传递有关矩阵的信息

    我不确定你要找的结构是否像矩阵中的连通图或类似的东西。。。我认为随机矩阵理论(比那些链接告诉你的更一般、更广泛)在这方面有一些结果


    也许这并不是你真正想要的,但顺便说一句,要得到矩阵的结构,没有一个一站式的解决方案。你必须使用多种工具来确定它,如果我要这样做,特征值将是我的第一选择。

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

    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[]
    
    表达这些关系的形式便于定义
    结构形式

    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
      ]
    

    一般来说可能很难。对于结构检查,例如,假设符号变量为实数的is it Hermitian,可将SameQ[mat,ComplexExpand[Conjugate[Transpose[mat]]]用作实用程序。如果您使用显式Re和Im,那么内置的HermitianMatrix XQ也可能有一些用处。同样的对称矩阵。@Daniel,我知道这不容易,但我想我会问的。
    HermitianMatrixQ
    SymmetricMatrixQ
    都很好,在显示仅具有这些对称类型的矩阵时非常有用。不幸的是,通常情况下,我使用的矩阵除了具有厄米特对称性外,通常还具有更复杂的对称性,我想要一个能够显示这种结构的工具。绝对不是一个简单的请求。@Daniel,
    MatrixPlot
    ArrayPlot
    有时也很有用,但它们不能揭示符号矩阵的结构,很难用它们来确定隐秘性。理想情况下,我想进行一次测试,以更清楚地揭示结构,而当前的工具需要进行多次测试。我想知道,如果矩阵的两个部分在数值上有某种相似性,这并不一定意味着它们是同一结构的一部分,是吗?参见RotationMatrix[a]//structureForm==>{{a”,“b”},{-“b”,“a”},而RotationMatrix[[Pi]/4]//structureForm==>{{a”,-“a”},{“a”,“a”}和RotationMatrix[[Pi]/8]//structureForm=>{{a”,“b”},{-“b”,“a”}@Sjoerd,在您给出的示例中,所有矩阵都是,因此它们具有相同的结构。因此,矩阵的各个部分必须具有某些规定的数值相似性。@RM,如果矩阵是纯数值的,那么特征值/向量是绝对正确的。然而,如果矩阵是符号的,由于公式的复杂性,特征值就不那么有用了。而且,有时仅仅能够看到这些值是如何排列的是很有帮助的。我意识到它不能是唯一使用的工具,但拥有它会很好。@rcollyer:你说得对,特征值在数值例子中非常有用。然而,我不同意特征值在符号矩阵中不太有用。是的,方程变得更混乱,随着矩阵的增大,它可能会变得更难。但对于较小的尺寸,如您的示例中所示,它们仍然值得一试。矩阵的特征值是特征多项式a-λI的根。Mathematica有一个内置函数
    CharacteristicPolymone
    ,它将为您提供矩阵的表达式。现在你有了一个很好的变量多项式(contd…),你可以随时使用
    判别式
    Δ
    来设置变量的界限
    
    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