Estoy transfiriendo un código existente de MATLAB a C ++ y tengo un sistema lineal para resolver (en lugar de la forma más típica )A x = b
La matriz es densa y de forma general, pero no es mayor que 1000x1000. Entonces, en MATLAB, la solución o la notación de barra diagonal encuentran la soluciónmrdivide(b,A)
x = b/A;
¿Cómo debo resolver esto en mi código C ++ usando rutinas BLAS y LAPACK?
Estoy familiarizado con la rutina LAPACK DGESV
que resuelve para .x
Entonces, un pensamiento que tenía es hacer algunas manipulaciones usando identidades de transposición de matriz:
Luego resuelva la forma final utilizando la DGESV
operación de la transpuesta . (por lo que cuesta transponer y cuesta resolver el sistema) A
¿Existe un enfoque más eficiente o mejor ?
Estoy trabajando con clases de matrices y vectores, así como la implementación de BLAS de la biblioteca BOOST uBLAS, así como enlaces a las rutinas de la biblioteca LAPACK. He estado usando esta configuración con éxito para otras operaciones y espero encontrar una solución limitada a estas bibliotecas.
Además, debo tener en cuenta que solo estoy realizando este tipo de operación unas pocas veces durante la configuración del código, por lo que el rendimiento no es una preocupación crítica.
Tal vez esto MATLAB documentación sobre mrdivide
es de gran ayuda para los demás.
fuente
boost::numeric::bindings::lapack::gesvx()
, pero esto no es parte de mi pregunta aquí. Si tengo éxito, volveré con una nota sobre cómo hacerlo.gesvx()
, aunque no sin algunos tropiezos en el camino. Cuando el argumento TRANS es 'T', la documentación de LAPACK dice quegesvx
resuelve , pero realmente resuelve porque se espera que la forma de los argumentos de entrada y estén en su -transpuesta de forma. Entonces, el argumento se transpone, mientras que y no. Genial, eso es más conveniente. Si alguien más se topa con esto tratando de usar enlaces numéricos de impulso, diré que no he podido obtener la interfaz de transposición utilizada en esta solución. para trabajar a través de los enlaces. A T X T = B T X B A X Bgesvx
formulario de transposiciónboost::numeric::bindings
. Envuelva la matriz transpuesta en la función. Esto identifica el parámetro como tipo de transposición :trans()
boost::numeric::bindings::lapack::gesvx( FACT, boost::numeric::bindings::trans(Atransposed), af, ipiv, equed, r, c, b, x, rcond, ferr, berr );
Puede calcular el pseudo inverso de , usando la descomposición QR de SVD, que están incluidos en LAPACK.A
Esto funcionará para cualquier rectangular .A
fuente