Я провожу много времени, рассматривая более крупные матрицы (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
, выше, тогда она становится доступной для алгоритмов графа.
Редактировать : Кстати, мое вдохновение пришло из серии Матричных алгоритмов ( 1 , 2 ) Стюарта.