使用Mathematica自动显示矩阵结构

时间:2011-04-01 15:37:15

标签: 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}}

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

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}, Conjugate, {2,1}}的{​​{1}},然后它就变得适合图算法。

编辑:顺便说一下,我的灵感来自Stewart的Matrix Algorithms系列(12)。

2 个答案:

答案 0 :(得分:4)

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

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
  ]

简而言之,只要一对与定义的关系匹配,此函数就会检查矩阵中每个可能的值对,从而推断替换规则。请注意关系定义如何以值 - &gt;形式的替换规则对表示。名称的。矩阵值分配有字母名称,从左到右,从上到下。假设优先级相同,则忽略冗余推断关系。

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

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

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

enter image description here

答案 1 :(得分:3)

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

  1. Hermitian /对称特征值有 真实的特征值。
  2. 正半正定矩阵 非负特征值,反之亦然。
  3. 旋转矩阵具有复杂的特征值。
  4. 循环矩阵的特征值只是DFT of the first row。循环矩阵的优点在于每个循环矩阵都具有相同的特征向量集。在某些情况下,这些结果(循环)可以扩展到Toeplitz矩阵。
  5. 如果您正在处理随机矩阵(实验观察可以建模为随机矩阵),您还可以阅读random matrix theory,它将特征值的分布与其中的基础对称关联起来。矩阵和元素的统计分布。具体地,

    1. 对称/埃尔米特高斯矩阵的特征值分布是[半圆]
    2. Wishart矩阵的特征值分布(如果A是随机高斯矩阵,W=AA'是Wishart矩阵)由Marcenko-Pastur distribution
    3. 给出

      此外,特征值之间的差异(间隔)也传达有关矩阵的信息。

      我不确定你所寻找的结构是否就像矩阵中的连接图或类似的东西......我假设随机矩阵理论(比这些链接更通用,更广泛会告诉你)在这方面有一些成果。

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