Soy nuevo en la ciencia computacional y ya he aprendido métodos básicos para la integración, la interpolación, métodos como RK4, Numerov, etc. en c ++, pero recientemente mi profesor me pidió que aprendiera cómo usar LAPACK para resolver problemas relacionados con las matrices. Como por ejemplo encontrar valores propios de una matriz compleja. Nunca he usado bibliotecas de terceros y casi siempre escribo mis propias funciones. He estado buscando por varios días, pero no puedo encontrar ninguna guía amigable para los aficionados a lapack. Todos están escritos en palabras que no entiendo y no sé por qué el uso de funciones ya escritas debería ser tan complicado. Están llenas de palabras como zgeev, dtrsv, etc. y estoy frustrado. Solo quiero codificar algo como este pseudocódigo:
#include <lapack:matrix>
int main(){
LapackComplexMatrix A(n,n);
for...
for...
cin>>A(i,j);
cout<<LapackEigenValues(A);
return 0;
}
No sé si estoy siendo tonto o aficionado. Pero de nuevo, esto no debería ser tan difícil, ¿verdad? Ni siquiera sé si debo usar LAPACK o LAPACK ++. (Escribo códigos en c ++ y no tengo conocimiento de Python o FORTRAN) y cómo instalarlos.
Respuestas:
No estaré de acuerdo con algunas de las otras respuestas y diré que creo que descubrir cómo usar LAPACK es importante en el campo de la computación científica.
Sin embargo, hay una gran curva de aprendizaje para usar LAPACK. Esto se debe a que está escrito en un nivel muy bajo. La desventaja de eso es que parece muy críptico y no es agradable para los sentidos. La ventaja de esto es que la interfaz es inequívoca y, básicamente, nunca cambia. Además, las implementaciones de LAPACK, como la Intel Math Kernel Library son realmente rápidas.
Para mis propios fines, tengo mis propias clases de C ++ de nivel superior que se ajustan a las subrutinas LAPACK. Muchas bibliotecas científicas también usan LAPACK debajo. A veces es más fácil usarlos, pero en mi opinión hay mucho valor en comprender la herramienta que se encuentra debajo. Con ese fin, proporcioné un pequeño ejemplo de trabajo escrito en C ++ usando LAPACK para comenzar. Esto funciona en Ubuntu, con el
liblapack3
paquete instalado y otros paquetes necesarios para la construcción. Probablemente se pueda usar en la mayoría de las distribuciones de Linux, pero la instalación de LAPACK y el enlace en su contra pueden variar.Aquí está el archivo
test_lapack.cpp
Esto se puede construir usando la línea de comando
Esto producirá un ejecutable llamado
test_lapack
. He configurado esto para leer en un archivo de entrada de texto. Aquí hay un archivo llamado quematrix.txt
contiene una matriz 3x3.Para ejecutar el programa simplemente escriba
en la línea de comando, y la salida debería ser
Comentarios:
extern "C"
sección en la parte superior, y que he agregado un guión bajo adgeev_
. Esto se debe a que la biblioteca fue escrita y construida en Fortran, por lo que esto es necesario para que los símbolos coincidan al vincular. Esto depende del compilador y del sistema, por lo que si usa esto en Windows, todo tendrá que cambiar.fuente
Normalmente me resisto a decirle a la gente lo que creo que deberían hacer en lugar de responder a su pregunta, pero en este caso voy a hacer una excepción.
Lapack está escrito en FORTRAN y la API es muy similar a FORTRAN. Hay una API C para Lapack que hace que la interfaz sea un poco menos dolorosa, pero nunca será una experiencia agradable usar Lapack desde C ++.
Alternativamente, hay una biblioteca de clases de matriz de C ++ llamada Eigen que tiene muchas de las capacidades de Lapack, proporciona un rendimiento computacional comparable a las mejores implementaciones de Lapack y es muy conveniente de usar desde C ++. En particular, así es como se podría escribir su código de ejemplo usando Eigen
Este ejemplo de problema de valor propio es un caso de prueba para la función Lapack
dgeev
. Puede ver el código FORTRAN y los resultados de este problema dgeev ejemplo y hacer sus propias comparaciones.fuente
operator,
! Nuncaoperator,
sobrecarga es más interesante / mejor de lo que parece. Se usa para inicializar matrices. Las entradas que inicializan la matriz pueden ser constantes escalares pero también pueden ser matrices o submatrices previamente definidas. Muy parecido a MATLAB. Desearía que mi habilidad de programación en C ++ fuera lo suficientemente buena como para implementar algo que me sofisticara ;-)Aquí hay otra respuesta en la misma línea que la anterior.
Debería buscar en la biblioteca de álgebra lineal Armadillo C ++ .
Pros:
DGESV
mumbo-jumbo, soloX = solve( A, B )
(aunque hay una razón detrás de esos nombres de funciones LAPACK de aspecto extraño ...).Así es como se vería el código de @ BillGreene con Armadillo:
fuente