résoudre

12

Je porte un code existant de MATLAB vers C ++ et j'ai un système linéaire pour résoudre (plutôt que la forme la plus typique A x = b )xA=bAx=b

La matrice est dense et de forme générale, mais ne dépasse pas 1000x1000. Donc, dans MATLAB, la solution est trouvée par la fonction ou la notation barre obliqueAmrdivide(b,A)x = b/A;

Comment résoudre ce problème dans mon code C ++ à l'aide des routines BLAS et LAPACK?

Je connais la routine LAPACK DGESVqui résout pour x .Ax=bx

Donc, une pensée que j'avais était de faire quelques manipulations en utilisant des identités de transposition matricielle:

(xA)T=bT

ATxT=bT

xT=(AT)1bT

Résolvez ensuite la forme finale en utilisant l' DGESVopération sur l' transposé . (donc coût pour transposer A et coût pour résoudre le système)ATA

Existe-t-il une approche plus efficace ou autrement meilleure ?

Je travaille avec les classes matricielles et vectorielles ainsi que l'implémentation BLAS de la bibliothèque BOOST uBLAS ainsi que les liaisons aux routines de la bibliothèque LAPACK. J'ai utilisé cette configuration avec succès pour d'autres opérations et j'espère trouver une solution limitée à ces bibliothèques.

De plus, je dois noter que je n'effectue ce type d'opération que quelques fois pendant la configuration du code, donc les performances ne sont pas une préoccupation critique.

Peut-être que cette documentation MATLAB sur mrdivideest utile pour les autres.

NoahR
la source

Réponses:

10

Réponse triviale pour le carré : qui résout également pour A T x = b quand .AdgesvxATx=bTRANS = 'T'

Veuillez noter qu'avec BLAS ou LAPACK, vous n'avez pratiquement pas à transposer (permutation d'éléments en mémoire) une matrice: la plupart des sous-programmes ont un TRANSargument pour s'adapter au fonctionnement sur la matrice de transposition ou sur une matrice stockée avec une disposition de mémoire différente. (La transposition équivaut à changer la disposition de la mémoire contiguë de Fortran à une configuration contiguë C et vice versa.)

Stefano M
la source
Merci pour la réponse et l'explication! J'ai fait très peu de travail avec LAPACK et maintenant je sais chercher l'option TRANS. J'ai du mal à faire avancer l'argument TRANS boost::numeric::bindings::lapack::gesvx(), mais cela ne fait pas partie de ma question ici. Si j'ai du succès, je reviendrai avec une note sur la façon de le faire.
NoahR
gesvx()gesvxATX=BATXT=BTXBAXBne sont pas. Génial, c'est plus pratique. Si quelqu'un d'autre tombe sur cela en essayant d'utiliser des liaisons numériques boost, je dirai que je n'ai pas pu obtenir l'interface de transposition utilisée dans ce soln. pour travailler à travers les liaisons.
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

Gil
la source
3
ARR1