2010-11-15 17 views
10

Sto usando ublas :: Compressed Matrix per lavorare con UMFPACK, un solver lineare sparse. Dato che sto facendo una simulazione, così ogni volta che il sistema lineare viene costruito in modo leggermente diverso che potrebbe comportare l'allargamento/restringimento della matrice dei coefficienti e alcune moltiplicazioni sparse della matrice. La scala del sistema lineare è di circa 25k.Esiste un modo efficace per modificare dinamicamente compress_matrix in boost?

Anche lì è una patch vincolante per spinta di lavorare con UMFPACK, ho ancora bisogno di cambiare la matrice di tanto in tanto, a volte anche per capire il numero di valori diversi da zero sarebbe in termini di tempo (idealmente, ho per dare il numero di valori diversi da zero quando inizializzo una matrice). Inoltre, utilizzo ublas :: range per aggiungere colonne/righe dinamicamente.

Quindi la mia domanda è: esiste un modo efficace per farlo? In questo momento è troppo lento per me. Trasporre una matrice con dimensioni pari a 15k costa quasi 6 secondi e l'aggiunta di circa 12.000 righe è veloce (perché suppongo sia una matrice principale), ma l'aggiunta dello stesso numero di colonne alla matrice può costare fino a 20 secondi (suppongo per lo stesso ragionamento come sopra, quindi anche io ho usato una matrice a colonna maggiore il tempo totale richiesto sarebbe lo stesso).

Si sta facendo disperatamente qui. Qualsiasi suggerimento è benvenuto.

Cheers.

+0

Da quando ho avuto quasi 30 viste ma nessuna risposta, penso che forse la mia domanda non è molto chiaro. Quindi ecco alcuni dettagli. – He01

+0

Dato che sto facendo la simulazione, per ogni passo temporale, ho assemblato un sistema lineare e lo risolvo che è fondamentalmente solo AX = B. Tuttavia, la matrice dei coefficienti A è solitamente composta da tre matrici. Una matrice di peso, due matrici dei coefficienti per i vincoli rigidi e i vincoli rigidi che non possono essere precalcolati. (Vedi commento successivo) – He01

+0

Poiché risolvendo il sistema lineare è il risultato di minimizzare una funzione quadratica in senso minimi quadrati, devo fare una moltiplicazione matrice-matrice a produrre un T matrice e una moltiplicazione matrice-vettore per rendere B per integrare il vincolo morbido matrice il sistema lineare. Poi devo aggiungere il matrice dei vincoli difficile da fondo e il diritto di T al fine di rendere A. Alla fine, dopo A e B fatte, posso li input in UMFPack. (Vedi commento successivo) – He01

risposta

0

Come si costruisce la matrice ogni volta, ci si interfaccia da un tipo di software diverso. In questo caso, il tempo speso per l'interfacciamento è piuttosto basso.

E si usa il flag -DNDEBUG, per uBlas, giusto?

Non sono sicuro ancora quale sia il problema ...

migliore, Umut

+0

Ciao Umut, grazie per la tua attenzione, lo proverò di più e cercherò di dare un'intera immagine qui. – He01

1

Io non sono familiarità con i pacchetti, ma perché voi (idealmente) devono specificare il numero di non- zero elementi nella tua matrice? Non puoi sovra-specificare e quindi ridurre le dimensioni?

Sono anche confuso dal motivo per cui l'aggiunta di colonne dovrebbe costare così tanto. Un formato sparse dovrebbe essere in grado di gestirlo. Concluderei che una delle due cose sta accadendo. O la tua matrice viene in qualche modo convertita in una matrice non sparsa prima di essere riconvertita (sembra orribile, e impossibile in qualsiasi pacchetto di matrice sparsa decente) o il codice per l'inserimento è quadratico, perché inserisce ripetutamente valori, spostandosi su tutti gli altri ciascuno tempo.

Quest'ultimo sembra probabile. Proverei a creare il mio codice "insert column" che prende la matrice sparse corrente, calcola quante altre voci ci sono, alloca un blocco più grande e copia in modo sequenziale, inserendo le nuove colonne man mano che si procede. Questo è lineare e dovrebbe essere essenzialmente istantaneo. Non so se sia sufficiente per risolvere l'intero problema, ma dovrebbe essere un inizio.

Inoltre, se la matrice ha un ordine di 25k voci, non c'è una risposta ragionevole al motivo per cui copiarlo o trasporlo dovrebbe richiedere più di un paio di millisecondi. Penso che sia necessario confrontare i singoli pezzi di questo problema e determinare esattamente dove sta andando il tempo, a meno che la soluzione sopra per aggiungere le colonne risolva il problema.

+0

Grazie Dov, sono stato molto impegnato da allora, ho lasciato che il problema rimanesse lì per un po '. Proverò i tuoi suggerimenti, pezzo per pezzo. – He01

+0

Hi Dov, per la parte di trasposizione, ho cercato di trasporre una matrice sparsa row-major e assegnazione a una matrice sparsa row-major, è molto più lento rispetto se assegno a una matrice sparsa column-major. Immagino che in qualche modo forse la rappresentazione interna sia cambiata anche durante la trasposizione. – He01

0

Invece di costruire A unendo diversi gruppi di valori, hai considerato di mantenerli in matrici separate e di utilizzare le routine del solutore esistenti per costruire il tuo risolutore generale? Fondamentalmente, si applica la scomposizione appropriata (LU, QR, qualunque) a una matrice di componenti, si esegue il corrispondente aggiornamento/trasformazione sui componenti successivi e si ripete per ogni matrice successiva.Dovresti quindi utilizzare le matrici dei componenti fattorizzate per calcolare la tua soluzione. Non è chiaro se la libreria con cui hai lavorato lo supporti direttamente, comunque, o se tu debba scrivere da solo alcune/tutte le routine numeriche.

0

Hai provato Eigen per questo tipo di problema? Recentemente hanno completato il supporto delle matrici sparse.

Problemi correlati