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=true12×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 cuiQdetinclude\armadillo_bits\auxlib_meat.hppslow=false12×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_lapacke 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 detfunzione 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