En mi proyecto, tengo que resolver un par de matrices tridiagonales en cada paso, por lo que es crucial tener un buen solucionador para esos. Hice mi propia implementación, solo la forma clásica de hacerlo descrita en Wikipedia. Luego intenté usar Lapack, ¡y para mi sorpresa fue más lento!
Ahora, dentro de Lapack parece que resuelve por factorización LU y me pregunto por qué, ¿no es más complejo de lo que podría ser?
Además, encontré un algoritmo en el libro "Recetas numéricas" de nr.com que divide recursivamente el sistema en problemas tridiagonales más pequeños. Parecía prometedor. ¿Hay alguna otra cosa por ahí?
Actualización: el tamaño del problema es de aproximadamente 1000x1000. Usé GotoBLAS, también te da una biblioteca Lapack 3.1.1. El problema no es simétrico. Usé la rutina Lapack para matrices tridiagonales generales.
fuente
Respuestas:
Está utilizando una implementación de referencia que hace pivote parcial. Las soluciones tridiagonales hacen muy poco trabajo y no requieren BLAS. Es probable que sea más lento que su código porque hace pivote parcial. El código fuente de dgtsv es sencillo.
Si va a resolver con la misma matriz varias veces, es posible que desee almacenar los factores utilizando dgttrf y dgttrs . Es posible que las implementaciones en un LAPACK optimizado como MKL, ACML o ESSL sean más efectivas.
fuente