gpt4 book ai didi

matrix - 使用 Mathematica 自动显示矩阵结构

转载 作者:行者123 更新时间:2023-12-05 00:04:36 25 4
gpt4 key购买 nike

我花了很多时间查看通常具有某种结构的较大矩阵(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}}对于 A ,上面,然后它变得适合图形算法。

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

最佳答案

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

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
]

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

请注意,该函数将在找到 26 个不同的值后用完名称——如果这是一个问题,则需要一个替代的名称分配策略。此外,名称被表示为字符串而不是符号。这可以方便地避开单字母符号名称的任何不需要的绑定(bind)。如果首选符号,则应用 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

关于matrix - 使用 Mathematica 自动显示矩阵结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5515591/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com