No meu projeto, tenho que resolver duas matrizes tridiagonais a cada passo do tempo, por isso é crucial ter um bom solucionador para elas. Fiz minha própria implementação, exatamente da maneira clássica de fazê-lo, descrita na Wikipedia. Então tentei usar o Lapack e, para minha surpresa, foi mais lento!
Agora, dentro de Lapack, parece que ele resolve a fatoração da LU e me pergunto por que, não é mais complexo do que poderia ser?
Além disso, encontrei um algoritmo no livro "Receitas Numéricas" do nr.com que divide recursivamente o sistema em problemas tridiagonais menores. Parecia promissor. Existem outras guloseimas por aí?
Atualização: o tamanho do problema é de cerca de 1000 x 1000. Eu usei o GotoBLAS, ele também fornece uma biblioteca Lapack 3.1.1. O problema não é simétrico. Usei a rotina Lapack para matrizes tridiagonais gerais.
fonte
Respostas:
Você está usando uma implementação de referência que faz rotação parcial. As soluções tridiagonais fazem muito pouco trabalho e não entram no BLAS. Provavelmente é mais lento que o seu código, porque faz rotação parcial. O código fonte do dgtsv é direto.
Se você resolver com a mesma matriz várias vezes, convém armazenar os fatores usando dgttrf e dgttrs . É possível que as implementações em um LAPACK otimizado, como MKL, ACML ou ESSL, tenham melhor desempenho.
fonte