Se B
è scarsa, può essere efficace (cioè, O (n), assumendo buon numero condizioni di B
) per risolvere per x_i
in
B x_i = a_i
(campione Conjugate Gradient codice è fornito su Wikipedia). Prendendo a_i
per essere i vettori di colonna di A
, si ottiene la matrice B^{-1} A
in O (n^2). Quindi è possibile sommare gli elementi diagonali per ottenere la traccia. In genere, è più semplice eseguire questa moltiplicazione inversa sparsa che ottenere l'intero set di autovalori. Per il confronto, Cholesky decomposition è O (n^3). (vedere il commento di Darren Engwirda in basso su Cholesky).
Se avete solo bisogno un'approssimazione alla traccia, si può effettivamente ridurre il costo a O (q n) dalla media
r^T (A B^{-1}) r
oltre q
vettori aleatori r
. Solitamente q << n
. Questa è una stima imparziale purché le componenti del vettore casuale r
soddisfano
< r_i r_j > = \delta_{ij}
dove <...>
indica una media per la distribuzione di r
. Ad esempio, i componenti r_i
potrebbero essere distribuiti gaussiani indipendenti con varianza unità. Oppure potrebbero essere selezionati uniformemente da + -1. In genere la traccia viene ridimensionata come O (n) e l'errore nella stima di traccia viene ridimensionato come O (sqrt (n/q)), pertanto l'errore relativo viene ridimensionato come O (sqrt (1/nq)).
fonte
2011-09-22 04:27:37
Penso che il tag C++ appartenga effettivamente qui, poiché la domanda riguarda un'implementazione utilizzando Eigen, una libreria di manipolazione della matrice C++. –
È una semidefinita positiva o definita positiva? –
@DavidZaslavsky Ho rimosso il tag – yannick