Verifica se due matrici 12x12 hanno lo stesso determinante


11

12×12Q

det(Q)=det(12IQJ)(1)
J

Attualmente lo sto facendo con la libreria di armadillo ma risulta essere troppo lento. Il fatto è che devo farlo per un trilione di matrici e si scopre che il calcolo dei due determinanti è il collo di bottiglia del mio programma. Quindi ho due domande

  1. C'è qualche trucco che potrei usare per calcolare il determinante più velocemente dato che ne conoscevo le dimensioni? È forse un'espansione disordinata per matrici 12×12 che potrebbero funzionare in questo caso?

  2. Esiste un altro modo efficace per testare l'uguaglianza (1)

Modificare. Per rispondere ai commenti. Ho bisogno di calcolare tutti i grafici collegati non auto-complementari G dell'ordine 13 in modo 13tale che G e G¯ abbiano lo stesso numero di spanning tree. La motivazione per questo può essere trovata in questo post di mathoverflow . Per quanto riguarda la macchina, la sto eseguendo su una macchina a 8 core da 3,4 Ghh in parallelo.

Modificare. Sono stato in grado di ridurre il tempo di esecuzione previsto del 50% creando un programma C per il calcolo specifico del determinante di una matrice 12×12 . I suggerimenti sono ancora ben accetti.


6
Quanto è lento è troppo lento? Quanto tempo impiega l'hardware? I trilioni di queste indipendenti in modo da poter calcolare molte di queste determinanti in parallelo? In tal caso, quanto è grande una macchina su cui puoi correre? Cosa ha portato a questo problema? Sei sicuro di dover calcolare i determinanti? Q
Bill Barth,

3
Con quale frequenza (per quale frazione di casi) i determinanti sono uguali / diversi? Se sono diversi per la maggior parte del tempo, potrebbe esserci un test più economico per determinare che potrebbero essere diversi e verificheresti che siano uguali solo se il primo test fallisce. Al contrario, se sono uguali per la maggior parte del tempo.
Wolfgang Bangerth,

1
Come già chiesto: potresti fornire qualche dettaglio su da dove proviene ? Forse esiste un approccio migliore rispetto ai determinanti alla cieca informatica. Q
JM,

4
L'idea che questa condizione debba essere testata "per un trilione di matrici" suggerisce 1) che è noto per avere una struttura speciale (altrimenti l'aspettativa che la condizione valga a caso è lieve) e 2) che un approccio migliore potrebbe essere quello di caratterizzare tutte le matrici con questa proprietà (con una formulazione efficacemente verificabile). QQ
Hardmath,

1
@hardmath Sì, è una matrice numero intero avente elementi diagonali che vanno da a e come off elementi diagonaliQ1121
Jernej

Risposte:


8

Dato che stai già usando C ++ e le tue matrici sono definite simmetriche positive, eseguirò una fattorizzazione di e anche di . Qui che anche sia definito positivo, altrimenti richiederà il pivot per stabilità numerica (è anche possibile che anche se non sia definito positivo, il pivot non sia necessario, ma devi provarlo).LDLTQ12IQJ12IQJLDLT

Questo è più veloce di una fattorizzazione LU e anche più veloce di Cholesky perché si evitano le radici quadrate. Il determinante è semplicemente il prodotto degli elementi della matrice diagonale . Il codice per eseguire una fattorizzazione di LDL è così semplice che si può scrivere in meno di 50 linee di C. La pagina di Wikipedia su di esso descrive l'algoritmo, e ho qualche semplice codice basato su modelli per fare Cholesky qui . Puoi semplificare enormemente e modificarlo per evitare la radice quadrata per implementare la fattorizzazioneDLDLT

Poiché è anche possibile controllare il formato di archiviazione, è possibile ottimizzare ulteriormente la routine per archiviare solo metà della matrice e impacchettarla in un array lineare per massimizzare la località di memoria. Scriverei anche semplici routine di aggiornamento dei punti e dei prodotti personalizzati di livello 1 poiché le dimensioni del problema sono così ridotte, dovresti lasciare che il compilatore inserisca le routine per ridurre l'overhead delle chiamate. Dal momento che è un ciclo di dimensioni fisse, il compilatore dovrebbe essere in grado di incorporare e srotolare automaticamente le cose quando appropriato.

Eviterei di provare a fare brutti scherzi per trarre vantaggio dal fatto che contiene all'interno dell'espressione. È probabile che per dimensioni così piccole di problemi, questi trucchi finiscano per essere più lenti rispetto alla semplice esecuzione di due calcoli determinanti separati. Naturalmente, l'unico modo per verificare queste affermazioni è provarlo.12IQJQ


1
In secondo luogo la raccomandazione di implementare , noto anche come Cholesky privo di root, poiché Armadillo non sembra avere un modo di trarre vantaggio dalla dominanza positiva / diagonale. LDLT
Hardmath,

5

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(12IQJ)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)Q12IQdet(Q)det(12IQJ)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=DJJD=diag(d1,,dn)det(Q)

det(Q)=(i=1ndi)(1i=1ndi1)

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=(11)T

det(DJ)=det(D)det(ID1J)

Ora è di nuovo al livello 1, ovvero . Si noti che il secondo determinante è semplicemente:D1J(d11dn1)T(11)

f(1)=det(ID1J)

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)D1Jf(x)n1xdi1

D1J(d11dn1)T=(di1)(d11dn1)T

Ne consegue che il polinomio caratteristico e è come mostrato sopra per , .f(x)=xn1(xdi1)f(1)det(ID1J)1di1

Si noti inoltre che se , quindi , una matrice diagonale il cui determinante è semplicemente il prodotto delle sue voci diagonali.Q=DJ12IQJ=12ID+JJ=12ID


Hm .. è in realtà dove è la matrice di adiacenza di quindi penso che questo risultato potrebbe non essere corretto. In particolare, ciò implicherebbe che il numero di spanning tree di un grafico è determinato dalla sua sequenza di gradi che non regge. QDAAGG
Jernej,

Le voci fuori diagonale di conterranno quindi generalmente 0 e -1. La decomposizione suggerito da Victor sfrutta simmetria e riduce il termine principale della conta funzionamento da a . Esiste un approccio intero esatto, ma probabilmente non è necessario per la matrice e le voci di dimensioni modeste. Se ho ben capito la costruzione, è definita positiva per la stessa ragione è. QLDLT23n313n312IQJQ
Hardmath,

@Jernej: Se ritieni che qualcosa che ho affermato sia errato, ho creato una chat room basata su questa domanda in cui la discussione può essere intrecciata senza commenti inutili qui.
Hardmath,

1

Se hai un modo strutturato di enumerare i grafici di cui desideri calcolare i determinanti, forse potresti trovare aggiornamenti di basso livello che ti trasferiscono da un grafico a un altro.

In tal caso, è possibile utilizzare il lemma determinante della matrice per calcolare in modo economico il determinante del grafico successivo da enumerare utilizzando la propria conoscenza del determinante del grafico corrente.

Cioè, per una matrice e vettori : Questo può essere generalizzato se U e V sono matrici e è : Au,v

det(A+uvT)=(1+vTA1u)det(A)
n×mAn×n
det(A+UVT)=det(Im+VTA1U)det(A)

Per calcolare efficacemente l'inverso, puoi usare la formula Sherman-Morrison per ottenere l'inverso della matrice successiva da quella corrente:

(A+uvT)1=A1A1uvTA11+vTA1u

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.