Estou portando um código existente do MATLAB para C ++ e tenho um sistema linear para resolver (em vez da forma mais típica A x = b )
A matriz é densa e de forma geral, mas não é maior que 1000x1000. Portanto, no MATLAB, a solução é encontrada pela função ou pela notação de barramrdivide(b,A)
x = b/A;
Como devo resolver isso no meu código C ++ usando as rotinas BLAS e LAPACK?
Estou familiarizado com a rotina LAPACK, DGESV
que resolve para x .
Então, um pensamento que tive foi fazer algumas manipulações usando identidades de transposição de matriz:
Em seguida, resolver a forma final utilizando DGESV
a operar na transposta . (portanto, custo para transpor A e custo para resolver o sistema)
Existe uma abordagem mais eficiente ou melhor ?
Estou trabalhando com classes matriciais e vetoriais, bem como com a implementação BLAS da biblioteca BOOST uBLAS, bem como com ligações às rotinas da biblioteca LAPACK. Eu tenho usado essa configuração com sucesso para outras operações e espero encontrar uma solução limitada a essas bibliotecas.
Além disso, devo observar que só estou executando esse tipo de operação algumas vezes durante a configuração do código, portanto, o desempenho não é uma preocupação crítica.
Talvez isso MATLAB documentação on mrdivide
é útil para os outros.
fonte
boost::numeric::bindings::lapack::gesvx()
, mas isso não faz parte da minha pergunta aqui. Se eu tiver sucesso, voltarei com uma nota sobre como fazê-lo.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 );
fonte