Nota importante : poiché questa sfida si applica solo alle matrici quadrate, ogni volta che utilizzo il termine "matrice", si presume che mi riferisca a una matrice quadrata. Lascio la descrizione "quadrata" per brevità.
sfondo
Molte operazioni legate alla matrice, come calcolare il determinante, risolvere un sistema lineare o estendere le funzioni con valori scalari alle matrici, sono rese più semplici usando una matrice diagonale (una i cui elementi che non sono sulla diagonale principale sono 0) che è simile alla matrice originale (che significa, per la matrice di input A
e la matrice diagonale D
, esiste una matrice invertibile P
tale che D = P^(-1) * A * P
; inoltre, D
e A
condividono alcune proprietà importanti, come autovalori, determinante e traccia). Per matrici con autovalori distinti (radici alle polinomio caratteristico della matrice, in soluzione det(A-λI) = 0
per λ
, dove I
è la matrice identità con le stesse dimensioni A
), diagonalizzazione è semplice:D
è una matrice con gli autovalori sulla diagonale principale ed P
è una matrice formata da autovettori corrispondenti a tali autovalori (nello stesso ordine). Questo processo si chiama eigendecomposition .
Tuttavia, le matrici con autovalori ripetuti non possono essere diagonali in questo modo. Fortunatamente, la normale forma Jordan di qualsiasi matrice può essere calcolata piuttosto facilmente, e non è molto più difficile da lavorare rispetto a una normale matrice diagonale. Ha anche la bella proprietà che, se gli autovalori sono unici, la decomposizione della Giordania è identica alla composizione geografica.
Spiegazione della decomposizione della Giordania
Per una matrice quadrata i A
cui autovalori hanno tutti una molteplicità geometrica di 1, il processo di decomposizione della Giordania può essere descritto come tale:
- Sia
λ = {λ_1, λ_2, ... λ_n}
l'elenco di autovalori diA
, con molteplicità, con autovalori ripetuti che compaiono consecutivamente. - Crea una matrice diagonale i
J
cui elementi sono gli elementi diλ
, nello stesso ordine. - Per ogni autovalore con molteplicità maggiore di 1, posizionare
1
a alla destra di ciascuna delle ripetizioni dell'autovalore nella diagonale principale diJ
, tranne l'ultima.
La matrice risultante J
è una forma normale della Giordania di A
(possono esistere più forme normali della Giordania per una data matrice, a seconda dell'ordine degli autovalori).
Un esempio funzionante
Sia A
la seguente matrice:
Gli autovalori di A
, con molteplicità, sono λ = {1, 2, 4, 4}
. Inserendo questi in una matrice diagonale, otteniamo questo risultato:
Successivamente, posizioniamo 1
s alla destra di tutti tranne uno di ciascuno degli autovalori ripetuti. Poiché 4
è l'unico autovalore ripetuto, posizioniamo un singolo 1
accanto al primo 4:
Questa è una forma normale della Giordania di A
(una singola matrice può potenzialmente avere diverse forme normali della Giordania valide, ma sto esaminando quel dettaglio a scopo di spiegazione).
L'obiettivo
Data una matrice quadrata A
come input, genera una forma normale valida di Jordan A
.
- L'input e l'output possono essere in qualsiasi formato ragionevole (array / list 2D / qualunque cosa, list / array / qualunque dei vettori di colonna o riga, un tipo di dati a matrice incorporato, ecc.).
- Gli elementi e gli autovalori di
A
saranno sempre numeri interi nell'intervallo[-200, 200]
. - Per semplicità, tutti gli autovalori avranno una molteplicità geometrica di 1 (e quindi vale il processo sopra).
A
sarà al massimo una matrice 10x10 e almeno una matrice 2x2.- Non sono consentiti builtin che calcolano autovalori e / o autovettori o eseguono la composizione elettronica, la decomposizione della Giordania o qualsiasi altro tipo di decomposizione / diagonalizzazione. Sono ammessi l'aritmetica della matrice, l'inversione della matrice e altri built-in della matrice.
Casi test
[[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@#&
? O è barare?