Ich portiere einen vorhandenen Code von MATLAB nach C ++ und habe ein lineares System zum Lösen von (anstelle der typischeren Form A x = b )
Die Matrix ist dicht und von allgemeiner Form, aber nicht größer als 1000 × 1000. In MATLAB wird die Lösung also durch die Funktion oder die Schrägstrichnotation gefundenmrdivide(b,A)
x = b/A;
Wie soll ich das in meinem C ++ - Code mit BLAS- und LAPACK-Routinen lösen?
Ich kenne die LAPACK-Routine, DGESV
die für x auflöst .
Ein Gedanke, den ich hatte, ist, einige Manipulationen mit Matrix-Transponierten-Identitäten durchzuführen:
Lösen Sie dann das endgültige Formular, indem Sie DGESV
das transponierte . (also kosten um A zu transponieren und kosten um System zu lösen)
Gibt es einen effizienteren oder auf andere Weise besseren Ansatz ?
Ich arbeite mit Matrix- und Vektorklassen sowie der BLAS-Implementierung aus der BOOST-uBLAS-Bibliothek sowie Bindungen an die LAPACK-Bibliotheksroutinen. Ich habe dieses Setup erfolgreich für andere Vorgänge verwendet und hoffe, eine Lösung zu finden, die auf diese Bibliotheken beschränkt ist.
Außerdem sollte ich beachten, dass ich diese Art von Operation nur einige Male während der Code-Einrichtung durchführe, sodass die Leistung kein kritisches Problem darstellt.
Vielleicht MATLAB Dokumentation auf mrdivide
für andere hilfreich.
quelle
boost::numeric::bindings::lapack::gesvx()
, aber dies ist nicht Teil meiner Frage hier. Wenn ich Erfolg habe, werde ich mit einem Hinweis darauf zurückkommen, wie es geht.gesvx()
gesvx
gesvx
boost::numeric::bindings
trans()
boost::numeric::bindings::lapack::gesvx( FACT, boost::numeric::bindings::trans(Atransposed), af, ipiv, equed, r, c, b, x, rcond, ferr, berr );
quelle