Senza alcune informazioni sulla costruzione di queste matrici simmetriche reali definite positive, i suggerimenti da formulare sono necessariamente abbastanza limitati.12×12
Ho scaricato il pacchetto Armadillo da Sourceforge e ho dato un'occhiata alla documentazione. Prova a migliorare le prestazioni del calcolo separato e , in cui è la matrice di rango uno di tutti, impostando ad es . La documentazione osserva che questo è il valore predefinito per matrici fino alla dimensione , quindi per omissione presumo che l' opzione sia predefinita per il caso .det(Q)det(12I−Q−J)Jdet(Q,slow=false)
4×4slow=true
12×12
Ciò che slow=true
presumibilmente fa è un perno parziale o completo per ottenere una forma di scaglione di fila, dalla quale si trova facilmente il determinante. Tuttavia, sai in anticipo che la matrice è definita positiva, quindi il perno non è necessario per la stabilità (almeno presumibilmente per la maggior parte dei tuoi calcoli. Non è chiaro se il pacchetto Armadillo genera un'eccezione se i perni diventano indebitamente piccoli, ma questo dovrebbe essere un caratteristica di un ragionevole pacchetto di algebra lineare numerica EDIT: ho trovato il codice Armadillo che implementa nel file di intestazione , usando modelli C ++ per una sostanziale funzionalità. L'impostazione non sembra influenzare il modo in cuiQdet
include\armadillo_bits\auxlib_meat.hpp
slow=false
12×12il determinante verrà eseguito perché il calcolo viene "gettato su un muro" su LAPACK (o ATLAS) in quel punto senza alcuna indicazione che non sia necessario il pivot; vedi det_lapack
e le sue invocazioni in quel file.
L'altro punto sarebbe quello di seguire la loro raccomandazione di costruire il pacchetto Armadillo che si collega ai ricambi ad alta velocità per BLAS e LAPACK, se li stai effettivamente usando; vedi Sez. 5 del file Armadillo README.TXT per i dettagli. [L'uso di una versione dedicata a 64 bit di BLAS o LAPACK è consigliato anche per velocità su macchine a 64 bit attuali.]
La riduzione delle file in forma di scaglione è essenzialmente eliminazione gaussiana e presenta complessità aritmetica . Per entrambe le matrici, ciò equivale a due volte che funzionano, oppure . Queste operazioni potrebbero essere il "collo di bottiglia" nella tua elaborazione, ma ci sono poche speranze che senza una struttura speciale in (o alcune relazioni note tra i trilioni di casi di test che consentano l'ammortamento) il lavoro potrebbe essere ridotto a .23n3+O(n2)43n3+O(n2)QO(n2)
Per fare un confronto, l'espansione da parte di cofattori di una matrice generale comportaoperazioni di moltiplicazione (e all'incirca tante addizioni / sottrazioni), quindi per il confronto ( vs. ) favorisce chiaramente l'eliminazione rispetto ai cofattori.n×nn!n=1212!=47900160023n3=1152
Un altro approccio che richiede sarebbe ridurre in forma tridiagonale con trasformazioni di Householder, che mette anche in forma tridiagonale. In seguito, il calcolo e può essere eseguito nelle operazioni . [L'effetto dell'aggiornamento di grado 1 nel secondo determinante può essere espresso come fattore scalare dato risolvendo un sistema tridiagonale.]43n3+O(n2)Q12I−Qdet(Q)det(12I−Q−J)O(n)−J
L'implementazione di un calcolo così indipendente potrebbe essere utile come controllo dei risultati di chiamate riuscite (o non riuscite) alla det
funzione di Armadillo .
Caso speciale: come suggerito da un commento di Jernej, supponiamo che cui come prima è la matrice (di grado 1) di tutti e è un matrice diagonale non singolare (positiva). In effetti per l'applicazione proposta nella teoria dei grafi si tratterebbe di matrici intere. Quindi una formula esplicita per è:Q=D−JJD=diag(d1,…,dn)det(Q)
det(Q)=(∏i=1ndi)(1−∑i=1nd−1i)
Uno schizzo della sua dimostrazione offre l'opportunità di illustrare una più ampia applicabilità, cioè ogni volta che ha un determinante noto e il sistema viene rapidamente risolto. Inizia fattorizzando:DDv=(1…1)T
det(D−J)=det(D)⋅det(I−D−1J)
Ora è di nuovo al livello 1, ovvero . Si noti che il secondo determinante è semplicemente:D−1J(d−11…d−1n)T(1…1)
f(1)=det(I−D−1J)
dove è il polinomio caratteristico di . Come matrice di rango 1, deve avere (almeno) fattori di per tenere conto del suo spazio nullo. L'autovalore "mancante" è , come si può vedere dal calcolo:f(x)D−1Jf(x)n−1x∑d−1i
D−1J(d−11…d−1n)T=(∑d−1i)(d−11…d−1n)T
Ne consegue che il polinomio caratteristico e è come mostrato sopra per , .f(x)=xn−1(x−∑d−1i)f(1)det(I−D−1J)1−∑d−1i
Si noti inoltre che se , quindi , una matrice diagonale il cui determinante è semplicemente il prodotto delle sue voci diagonali.Q=D−J12I−Q−J=12I−D+J−J=12I−D