Aggiornamento diagonale di una matrice definita positiva simmetrica


19

è unamatrice sparsa n × n simmetrica positiva definita (SPD). G è una matrice diagonale sparsa. n è grande ( n > 10000) e il numero di nonzeros in G è di solito 100 ~ 1000.An×nGnnG

è stato fattorizzato nella forma di Cholesky come L D L T .ALDLT

Come aggiornare e D in modo efficiente quando A diventa A + G ?LDAA+G


G ha solo elementi positivi? In tal caso, ecco un limite superiore banale: visualizza l'aggiornamento diagonale come somma degli aggiornamenti di rango uno. Esistono metodi O (n ^ 2) per calcolare la fattorizzazione LDL ^ t di un aggiornamento di livello uno (la ricerca di Google fornisce esempi). Quindi il tuo aggiornamento diagonale verrà eseguito in O (rn ^ 2) dove r è il numero di elementi diagonali diversi da zero di G. Data la natura specifica di questi aggiornamenti ci sono scorciatoie per salvare alcuni calcoli, ma non è chiaro se è possibile ridurre l'ordine sotto O (rn ^ 2).

3
Sono d'accordo- Non credo che ci sia alcun modo per eseguire gli aggiornamenti diagonali di una fattorizzazione di Cholesky più velocemente della semplice ripetizione della fattorizzazione, ma è possibile effettuare gli aggiornamenti di grado uno in e devi fare solo uno per ciascuno nonzero sulla diagonale di G . O(m2)G
Brian Borchers,

10
Per e n n z ( G ) nell'ordine delle centinaia, sarà difficile da battere il refactoring A . Se la dimensione di A diventa molto più grande e G è molto scarsa, potrebbe ripagare. In ogni caso, i possibili aggiornamenti e approssimazioni sono trattati in modo approfondito da I sistemi lineari simmetrici fissi e diagonali possono essere risolti in un tempo quadratico dopo il pre-calcolo? . n104nnz(G)AAG
Jed Brown,

5
Jed, penso che dovresti promuovere il tuo commento a una risposta qui.
Michael Grant,

Risposte:


3

L'ultima versione del pacchetto CHOLMOD SuiteSparse (beta 4.4.5) supporta la modifica di una riga / colonna simmetrica (aggiornamento rank2) per la decomposizione di LDLT , utilizzando un'API matlab (e C). L'ho usato con successo in uno dei miei progetti.

Puoi usarlo per fare nnz(G) aggiornamenti alla fattorizzazione. Si basa su questo documento.

Pertanto, la complessità sarà O(nnz(G)nnz(L)) . Dove nnz(L) può essere significativamente ridotto quando si utilizza una permutazione che riduce il riempimento per una A sparsaA

Il pacchetto può essere scaricato da qui

Di seguito sono riportate alcune note fornite dal proprietario del pacchetto (Prof. Tim Davis):

API:

LD = ldlrowmod (LD, k) elimina la riga / colonna k, impostando A (:, k) e A (k, :) sulla kth riga / colonna dell'identità.

LD = ldlrowmod (LD, k, C) sostituisce la kth row / col di A (che deve essere la kth row / col di identità) con la colonna sparsa C.

Complessità:

O(nnz(L))nnz(L)O(n)O(n)

Riempimento riducente permutazione:

LDLTLDLTPAPTL

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.