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 )
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 obliquemrdivide(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 DGESV
qui résout pour x .
Donc, une pensée que j'avais était de faire quelques manipulations en utilisant des identités de transposition matricielle:
Résolvez ensuite la forme finale en utilisant l' DGESV
opération sur l' transposé . (donc coût pour transposer A et coût pour résoudre le système)
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 mrdivide
est utile pour les autres.
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.