Matrix 用Mathematica自动揭示矩阵结构
我花了很多时间研究较大的矩阵(10x10、20x20等),它们通常有一些结构,但随着它们变大,很难快速确定它们的结构。理想情况下,我想让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
(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的矩阵算法系列(,)。你试过看特征值吗?特征值揭示了矩阵结构和对称性的大量信息,是数据集统计分析的标准。例如
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