我花了很多时间研究通常具有某种结构的较大矩阵(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}},然后它就变得适合图算法。
答案 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
答案 1 :(得分:3)
您是否尝试过查看特征值?特征值揭示了关于矩阵结构和对称性的大量信息,是数据集统计分析的标准。例如,
如果您正在处理随机矩阵(实验观察可以建模为随机矩阵),您还可以阅读random matrix theory,它将特征值的分布与其中的基础对称关联起来。矩阵和元素的统计分布。具体地,
A
是随机高斯矩阵,W=AA'
是Wishart矩阵)由Marcenko-Pastur distribution 此外,特征值之间的差异(间隔)也传达有关矩阵的信息。
我不确定你所寻找的结构是否就像矩阵中的连接图或类似的东西......我假设随机矩阵理论(比这些链接更通用,更广泛会告诉你)在这方面有一些成果。
也许这不是你想要的,但是afaik,没有一站式解决方案来获得矩阵的结构。你必须使用多种工具来确定它,如果我这样做,特征值将是我的第一个选择。