Le risposte positive più vicine alla tua domanda che ho potuto trovare sono le perturbazioni diagonali sparse (vedi sotto).
Detto questo, non conosco alcun algoritmo per il caso generale, anche se c'è una generalizzazione della tecnica che hai citato per i cambiamenti scalari dalle matrici SPD a tutte le matrici quadrate:
Data qualsiasi matrice quadrata , esiste una decomposizione di Schur , dove è unitaria e è triangolare superiore, e A + σ I = U ( T + σ I ) U H fornisce una decomposizione di Schur di A + σ Io . Pertanto, la tua idea di precomputazione si estende a tutte le matrici quadrate attraverso l'algoritmo:A = U T U H U TAA=UTUHUTA+σI=U(T+σI)UHA+σI
- Calcola al massimo in O ( n 3 ) lavori.[U,T]=schur(A)O(n3)
- Risolvi ogni tramite x : = U ( T + σ I ) - 1 U H b nell'opera O ( n 2 ) (l'inversione centrale è semplicemente una sostituzione).(A+σI)x=bx:=U(T+σI)−1UHbO(n2)
Questa linea di ragionamento si riduce all'approccio che hai menzionato quando è SPD poiché la decomposizione di Schur si riduce a un EVD per matrici normali e l'EVD coincide con l'SVD per le matrici definite positive di Hermitian.A
Risposta all'aggiornamento:
fino a quando non avrò una prova, cosa che non faccio, mi rifiuto di affermare che la risposta è "no". Tuttavia, posso dare alcuni spunti sul perché è difficile, così come un'altra sottocassa in cui la risposta è sì.
La difficoltà essenziale è che, sebbene l'aggiornamento sia diagonale, è ancora in generale al completo, quindi lo strumento principale per l'aggiornamento di un inverso, la formula di Sherman-Morrison-Woodbury , non sembra aiutare. Anche se il caso dello spostamento scalare è anche di rango massimo, è un caso estremamente speciale poiché commuta con ogni matrice, come hai detto.
Detto questo, se ogni era scarsa, cioè avevano ciascuno O ( 1 ) nonzeros, allora la formula di Sherman-Morrison-Woodbury produce una soluzione O ( n 2 ) con ogni coppia { D , b } . Ad esempio, con un unico diverso da zero al j esima voce diagonale, in modo che D = δ e j e H j :DO(1)O(n2){D,b}jD=δejeHj
[A−1+δejeHj]−1=A−1−δA−1ejeHjA−11+δ(eHjA−1ej),
dove è il j esimo vettore di base di serie .ejj
Un altro aggiornamento: dovrei menzionare che ho provato il precondizionatore che @GeoffOxberry ha suggerito su alcune matrici SPD 1000 × 1000 casuali usando PCG e, forse non a caso, sembra ridurre notevolmente il numero di iterazioni quando | | D | | 2 / | | A | | 2 è piccolo, ma non quando è O ( 1 ) o superiore.A−11000×1000||D||2/||A||2O(1)