Использование Mathematica для автоматического раскрытия матричной структуры - PullRequest
4 голосов
/ 01 апреля 2011

Я провожу много времени, рассматривая более крупные матрицы (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 ) Стюарта.

Ответы [ 2 ]

4 голосов
/ 03 апреля 2011

Мы можем начать с определения отношений, которые мы хотим распознать:

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
  ]

В двух словах, эта функция проверяет каждую возможную пару значений в матрице, выводя правило подстановки всякий раз, когда пара соответствует определенной взаимосвязи.Обратите внимание, как определения отношений выражаются в виде пар правил замещения в форме значение -> имя .Матричным значениям присваиваются буквенные имена, начиная слева направо и сверху вниз.Избыточные выведенные отношения игнорируются, предполагая приоритет в том же порядке.

Остерегайтесь того, что у функции закончатся имена после того, как она найдет 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

3 голосов
/ 01 апреля 2011

Вы пробовали смотреть на собственные значения? Собственные значения раскрывают много информации о структуре и симметрии матриц и являются стандартными в статистическом анализе наборов данных. Например,

  1. эрмитово / симметричные собственные значения имеют реальные собственные значения.
  2. Положительные полуопределенные матрицы имеют неотрицательные собственные значения и наоборот.
  3. Матрицы вращения имеют сложные собственные значения.
  4. Циркулянтные матрицы имеют собственные значения, которые являются просто DFT первой строки . Прелесть циркулянтных матриц в том, что каждая циркулянтная матрица имеет такой же набор собственных векторов. В некоторых случаях эти результаты (циркулянты) могут быть распространены на матрицы Теплица.

Если вы имеете дело со случайными матрицами (экспериментальное наблюдение можно смоделировать как случайную матрицу), вы также можете прочитать Теорию случайных матриц , которая связывает распределения собственных значений с основные симметрии в матрице и статистические распределения элементов. В частности,

  1. Распределение собственных значений симметричных / эрмитовых гауссовых матриц имеет вид [полукруга]
  2. Распределения собственных значений матриц Уишарта (если A - случайная гауссова матрица, W=AA' - матрица Уишарта) задаются распределением Марченко-Пастура

Кроме того, различия (интервалы) между собственными значениями также передают информацию о матрице.

Я не уверен, что искомая структура похожа на связанный граф внутри матрицы или что-то подобное ... Я предполагаю, что теория случайных матриц (которая является более общей и обширной, чем те ссылки, которые вам когда-либо скажут) ) имеет некоторые результаты в этом отношении.

Возможно, это не совсем то, что вы искали, но, на самом деле, нет единого решения для получения структуры матрицы. Вам придется использовать несколько инструментов, чтобы придать ему гвоздь, и если бы я это сделал, собственные значения были бы моим первым выбором.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...