risolvi


12

Sto trasferendo un codice esistente da MATLAB a C ++ e ho un sistema lineare per risolvere (piuttosto che la forma più tipica A x = b )xA=bAx=b

La matrice è densa e di forma generale, ma non è più grande di 1000x1000. Quindi in MATLAB, la soluzione è trovata dalla funzione o dalla notazione di barraAmrdivide(b,A)x = b/A;

Come devo risolvere questo nel mio codice C ++ usando le routine BLAS e LAPACK?

Conosco la routine LAPACK DGESVche risolve per x .Ax=bx

Quindi, ho pensato che avrei dovuto fare alcune manipolazioni usando le identità di trasposizione della matrice:

(xA)T=bT

ATxT=bT

xT=(AT)1bT

Quindi risolvi il modulo finale usando le DGESVoperazioni sulla trasposta . (quindi costo per trasporre A e costo per risolvere il sistema)ATA

Esiste un approccio più efficiente o comunque migliore ?

Sto lavorando con le classi di matrici e vettori, nonché l'implementazione BLAS dalla libreria BOOST uBLAS, nonché i collegamenti alle routine della libreria LAPACK. Ho usato questa configurazione con successo per altre operazioni e spero di trovare una soluzione limitata a queste librerie.

Inoltre, dovrei notare che eseguo questo tipo di operazione solo alcune volte durante l'impostazione del codice, quindi le prestazioni non sono un problema critico.

Forse questa documentazione MATLAB su mrdivideè utile per gli altri.

Risposte:


10

AdgesvxATx=bTRANS = 'T'

Si noti che con BLAS o LAPACK difficilmente è necessario trasporre (scambiando elementi in memoria) una matrice: la maggior parte delle subroutine ha un TRANSargomento da utilizzare per il funzionamento sulla matrice di trasposizione o su una matrice memorizzata con un layout di memoria diverso. (La trasposizione equivale a cambiare il layout di memoria contiguo di Fortran in uno C-contiguos e viceversa.)


Grazie per la risposta e la spiegazione! Ho lavorato pochissimo con LAPACK e ora so cercare l'opzione TRANS. Ho problemi a far funzionare l'argomento TRANS boost::numeric::bindings::lapack::gesvx(), ma questo non fa parte della mia domanda qui. Se avrò successo, tornerò con una nota su come farlo.
NoahR

gesvx()gesvxATX=BATXT=BTXBAXBnon sono. Fantastico, è più conveniente. Se qualcun altro si imbatte in questo tentativo di utilizzare i collegamenti numerici boost, dirò che non sono stato in grado di ottenere l'interfaccia di trasposizione utilizzata in questo soln. lavorare attraverso gli attacchi.
NoahR

gesvxboost::numeric::bindingsATtrans()boost::numeric::bindings::lapack::gesvx( FACT, boost::numeric::bindings::trans(Atransposed), af, ipiv, equed, r, c, b, x, rcond, ferr, berr );

0

A

xA=bxQR=bx=bR1QT

A


3
ARR1
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.