Wichtiger Hinweis : Da diese Herausforderung nur für quadratische Matrizen gilt, wird jedes Mal, wenn ich den Begriff "Matrix" verwende, davon ausgegangen, dass ich mich auf eine quadratische Matrix beziehe. Ich lasse die "quadratische" Beschreibung der Kürze halber weg.
Hintergrund
Viele matrixbezogene Operationen, wie das Berechnen der Determinante, das Lösen eines linearen Systems oder das Erweitern von skalarwertigen Funktionen auf Matrizen, werden durch die Verwendung einer Diagonalmatrix (deren Elemente, die sich nicht auf der Hauptdiagonale befinden, 0 sind) vereinfacht auf die ursprüngliche Matrix (dh, für die Eingangsmatrix A
und der Diagonalmatrix D
gibt es einige invertierbare Matrix , P
so dass D = P^(-1) * A * P
, auch, D
und A
einige wichtige Eigenschaften teilen, wie Eigenwerte, Determinante und Spur). Für Matrizen mit unterschiedlichen Eigenwerten (die Wurzeln zu der charakteristischen Polynom der Matrix, durch die Lösung gegeben det(A-λI) = 0
für die λ
, in denen I
die Identitätsmatrix mit den gleichen Abmessungen wie A
) ist Diagonalisierung einfach:D
ist eine Matrix mit den Eigenwerten auf der Hauptdiagonale und P
ist eine Matrix, die aus Eigenvektoren gebildet wird, die diesen Eigenwerten entsprechen (in derselben Reihenfolge). Diesen Vorgang nennt man eigendecomposition .
Matrizen mit wiederholten Eigenwerten können auf diese Weise jedoch nicht diagonalisiert werden. Glücklicherweise kann die jordanische Normalform jeder Matrix relativ einfach berechnet werden und ist nicht viel schwerer zu verarbeiten als eine reguläre Diagonalmatrix. Es hat auch die nette Eigenschaft, dass, wenn die Eigenwerte eindeutig sind, die Jordan-Zerlegung mit der eigendecomposition identisch ist.
Jordanien Zersetzung erklärt
Für eine quadratische Matrix, A
deren Eigenwerte alle eine geometrische Multiplizität von 1 haben, kann der Prozess der Jordanzerlegung folgendermaßen beschrieben werden:
- Sei
λ = {λ_1, λ_2, ... λ_n}
die Liste von EigenwertenA
mit Multiplizität, wobei wiederholte Eigenwerte nacheinander auftreten. - Erstellen Sie eine Diagonalmatrix,
J
deren Elemente die Elemente vonλ
in derselben Reihenfolge sind. - Platzieren Sie für jeden Eigenwert mit einer Multiplizität größer als 1 a
1
rechts von jeder Wiederholung des Eigenwerts in der Hauptdiagonale vonJ
, mit Ausnahme der letzten.
Die resultierende Matrix J
ist eine Jordan-Normalform von A
(für eine gegebene Matrix kann es abhängig von der Reihenfolge der Eigenwerte mehrere Jordan-Normalformen geben).
Ein gelungenes Beispiel
Sei A
die folgende Matrix:
Die Eigenwerte von A
mit Multiplizität sind λ = {1, 2, 4, 4}
. Wenn wir diese in eine diagonale Matrix einfügen, erhalten wir das folgende Ergebnis:
Als nächstes platzieren wir 1
s rechts von allen bis auf einen der wiederholten Eigenwerte. Da dies 4
der einzige wiederholte Eigenwert ist, setzen wir eine einzelne 1
neben die erste 4:
Dies ist eine jordanische Normalform von A
(eine einzelne Matrix kann möglicherweise mehrere gültige jordanische Normalformen haben, aber ich beschreibe dieses Detail zur Erläuterung).
Die Aufgabe
Bei einer quadratischen Matrix A
als Eingabe wird eine gültige jordanische Normalform von ausgegeben A
.
- Die Eingabe und Ausgabe kann in jedem vernünftigen Format erfolgen (2D-Array / Liste / was auch immer, Liste / Array / was auch immer von Spalten- oder Zeilenvektoren, ein eingebauter Matrixdatentyp usw.).
- Die Elemente und Eigenwerte von
A
werden immer ganze Zahlen im Bereich sein[-200, 200]
. - Der Einfachheit halber haben alle Eigenwerte eine geometrische Multiplizität von 1 (und somit gilt der obige Prozess).
A
wird höchstens eine 10x10-Matrix und mindestens eine 2x2-Matrix sein.- Builtins, die Eigenwerte und / oder Eigenvektoren berechnen oder eine Neukomposition, Jordan-Dekomposition oder eine andere Art von Dekomposition / Diagonalisierung durchführen, sind nicht zulässig. Matrixarithmetik, Matrixinversion und andere eingebaute Matrizen sind zulässig.
Testfälle
[[1, 0], [0, 1]] -> [[1, 1], [0, 1]]
[[3, 0], [0, 3]] -> [[1, 1], [0, 1]]
[[4, 2, 2], [1, 2, 2],[0, 3, 3]] -> [[6, 0, 0], [0, 3, 0], [0, 0, 0]]
[[42, 48, 40, 64, 64], [41, 47, 31, 58, 42], [-55, -47, -27, -74, -46], [-46, -58, -46, -70, -68], [30, 20, 12, 34, 18]] -> [[10, 0, 0, 0, 0], [0, -18, 0, 0, 0], [0, 0, 6, 1, 0], [0, 0, 0, 6, 1], [0, 0, 0, 0, 6]]
Last@JordanDecomposition@#&
? Oder betrügt es?