¿Alguien tiene recomendaciones sobre una biblioteca de matriz de C ++ rápida y utilizable?
Lo que quiero decir con usable es lo siguiente:
- Los objetos de matriz tienen una interfaz intuitiva (por ejemplo: puedo usar filas y columnas mientras indexo)
- Puedo hacer cualquier cosa con la clase de matriz que puedo hacer con LAPACK y BLAS
- API fácil de aprender y usar
- Relativamente fácil de instalar en Linux (ahora uso Ubuntu 11.04)
Para mí, la usabilidad es más importante que la velocidad o el uso de memoria en este momento, para evitar la optimización prematura. Al escribir el código, siempre podría usar matrices 1-D (o vectores STL) y una aritmética de índice o puntero adecuada para emular una matriz, pero preferiría no hacerlo para evitar errores. También me gustaría centrar mi esfuerzo mental en el problema real que estoy tratando de resolver y programar en el dominio del problema, en lugar de utilizar parte de mi atención finita para recordar todos los pequeños trucos de programación que utilicé para emular matrices como matrices. , y recuerde los comandos de LAPACK, etc. Además, cuanto menos código tenga que escribir, y cuanto más estandarizado sea, mejor.
Denso versus escaso no importa todavía; Algunas de las matrices con las que estoy tratando serán escasas, pero no todas. Sin embargo, si un paquete particular maneja bien matrices densas o dispersas, vale la pena mencionarlo.
El moderar tampoco me importa mucho, ya que trabajaré con tipos numéricos estándar y no necesito almacenar nada más que dobles, flotantes o ints. Es agradable, pero no es necesario para lo que me gustaría hacer.
fuente
Respuestas:
He reunido lo siguiente de la investigación en línea hasta ahora:
Utilicé Armadillo un poco y encontré que la interfaz era lo suficientemente intuitiva, y fue fácil localizar paquetes binarios para Ubuntu (y supongo que otras distribuciones de Linux). No lo he compilado desde la fuente, pero espero que no sea demasiado difícil. Cumple con la mayoría de mis criterios de diseño y utiliza álgebra lineal densa. Puede llamar a las rutinas LAPACK o MKL. En general, no es necesario compilar Armadillo, es una biblioteca basada exclusivamente en plantillas: solo incluye el encabezado y el enlace a BLAS / LAPACK o MKL, etc.
He escuchado cosas buenas sobre Eigen , pero no lo he usado. Se dice ser rápida , utiliza plantillas, y es compatible con el álgebra lineal densa. No tiene LAPACK o BLAS como dependencia, pero parece ser capaz de hacer todo lo que LAPACK puede hacer (además de algunas cosas que LAPACK no puede). Muchos proyectos usan Eigen, lo cual es prometedor. Tiene un paquete binario para Ubuntu, pero como biblioteca de solo encabezado, es trivial de usar también en otros lugares.
La versión 4 de Matrix Template Library también parece prometedora y utiliza plantillas. Admite álgebra lineal densa y dispersa, y puede llamar a UMFPACK como un solucionador disperso. Las características no están claras en su sitio web. Tiene un paquete binario para Ubuntu, descargable desde su sitio web.
PETSc , escrito por un equipo del Laboratorio Nacional de Argonne, tiene acceso a solucionadores lineales dispersos y densos, por lo que supongo que puede funcionar como una biblioteca matricial. Está escrito en C, pero creo que tiene enlaces de C ++ (e incluso si no fuera así, llamar a C desde C ++ no es un problema). La documentación es increíblemente completa. El paquete es un poco exagerado para lo que quiero hacer ahora (multiplicación e indexación de matrices para configurar programas lineales de enteros mixtos), pero podría ser útil como un formato de matriz para mí en el futuro, o para otras personas que tienen necesidades diferentes que yo
Trilinos , escrito por un equipo del Sandia National Laboratory, proporciona interfaces C ++ orientadas a objetos para matrices densas y dispersas a través de su componente Epetra, e interfaces con plantillas para matrices densas y dispersas a través de su componente Tpetra. También tiene componentes que brindan funcionalidad de solucionador lineal y de solución propia. La documentación no parece ser tan pulida o prominente como PETSc; Trilinos parece el análogo de Sandia de PETSc. PETSc puede llamar a algunos de los solucionadores de Trilinos. Los binarios para Trilinos están disponibles para Linux.
Blitz es una biblioteca orientada a objetos de C ++ que tiene binarios de Linux. No parece mantenerse activamente (29-06-2012: ¡acaba de aparecer una nueva versión ayer!), Aunque la lista de correo está activa, por lo que hay alguna comunidad que la usa. No parece hacer mucho en la forma de álgebra lineal numérica más allá de BLAS, y parece una biblioteca de matriz densa. Utiliza plantillas.
Boost :: uBLAS es una biblioteca orientada a objetos C ++ y parte del proyecto Boost. Admite plantillas y álgebra lineal numérica densa. He oído que no es particularmente rápido.
La Plantilla numérico Toolkit es una biblioteca de C ++ orientado a objetos desarrollado por NIST. Su autor, Roldan Pozo, parece contribuir con parches ocasionalmente, pero ya no parece estar en desarrollo activo (la última actualización fue 2010). Se enfoca en álgebra lineal densa y proporciona interfaces para algunas descomposiciones de matriz básicas y un solucionador de valores propios.
Elemental , desarrollado por Jack Poulson, es un paquete de software de álgebra lineal densa de memoria distribuida (paralela) escrito en un estilo similar a FLAME . Para obtener una lista de características y antecedentes del proyecto, consulte su documentación . FLAME tiene una biblioteca asociada para álgebra lineal densa secuencial y de memoria compartida, llamada libflame , que parece estar escrita en C. orientada a objetos. las bibliotecas de álgebra lineal son más una ciencia y menos un arte negro.
Hay otras bibliotecas que se pueden agregar a la lista; Si contamos los paquetes de álgebra lineal dispersos como "bibliotecas matriciales", la mejor libre que conozco en C es SuiteSparse , que está programada en estilo orientado a objetos. He usado SuiteSparse y me resultó bastante fácil de aprender; depende de BLAS y LAPACK para algunos de los algoritmos que descomponen problemas dispersos en muchos subproblemas de álgebra lineal pequeños y densos. El autor principal del paquete, Tim Davis, es increíblemente útil y un gran tipo versátil.
Los Harwell subrutinas Las bibliotecas son famosos por sus escasas rutinas de álgebra lineal, y son gratis para los usuarios académicos, aunque tenga que pasar por este proceso de llenar un formulario y recibir un correo electrónico para cada archivo que desea descargar. Dado que las subrutinas a menudo tienen dependencias, el uso de un solucionador puede requerir la descarga de cinco o seis archivos, y el proceso puede volverse algo tedioso, especialmente porque la aprobación del formulario no es instantánea.
También hay otros solucionadores de álgebra lineal dispersos, pero por lo que puedo decir, MUMPS y otros paquetes se centran principalmente en la solución de sistemas lineales, y resolver sistemas lineales es la menor de mis preocupaciones en este momento. (Tal vez más tarde, necesitaré esa funcionalidad, y podría ser útil para otros).
fuente
Este documento fue escrito en marzo de 2009 para ayudar en la elección de una biblioteca de álgebra lineal para una biblioteca científica. Evalúa la portabilidad, la interfaz de alto nivel y las licencias para varias bibliotecas, entre ellas Eigen, GSL, Lapack ++ MTL, PETSc, Trilinos y uBlas. Parece ser particularmente aficionado a Flens y Seldon . (Uno de los requisitos era que las plantillas C ++ y las matrices dispersas debían ser compatibles).
fuente
De todos los proyectos enumerados anteriormente, en realidad solo hay dos pesos pesados que son extremadamente utilizados (y por buenas razones): PETSc y Trilinos. Ambos están desarrollados profesionalmente y tienen una gran base de desarrolladores. Todos los demás son proyectos bastante pequeños en comparación con estos dos, y recomendaría ir con ellos porque (i) serán compatibles durante mucho tiempo y (ii) es probable que ya tengan todas las funcionalidades que necesitará con respecto a álgebra lineal (y mucho más además de eso).
fuente
Si tu quieres
Entonces te recomiendo que eches un vistazo a mi biblioteca FLENS . Lo diseñé para exactamente este tipo de tareas. Sin embargo, requiere un compilador conforme C ++ 11 (por ejemplo, gcc 4.7 o clang).
FLENS le ofrece exactamente el mismo rendimiento que la implementación BLAS subyacente. Hay algunos puntos de referencia (bastante antiguos) que muestran esto
Lo mismo puede decirse de FLENS-LAPACK, solo le brinda exactamente el mismo rendimiento que el LAPACK de Netlib si se usa la misma implementación BLAS.
Con respecto a los nuevos puntos de referencia, permítanme entrar en más detalles ...
Hace algún tiempo le pregunté a Clint Whaley (el autor de ATLAS) qué piensa sobre los puntos de referencia publicados en el sitio de Eigen. Él acaba de confirmar a mi sospechoso de que estos puntos de referencia probablemente no sean confiables. Mientras tanto, algunos otros puntos de referencia realizados como sugirió Clint. Los detalles se pueden encontrar en el sitio de ATLAS y en la lista de correo de Eigen. Los puntos de referencia no están bien presentados en los gráficos, pero muestran que ATLAS siempre es aproximadamente un 40% más rápido que Eigen. Esto contradice los puntos de referencia del sitio Eigen pero confirma otros puntos de referencia (por ejemplo, los de blaze-lib).
Tenga en cuenta que para el álgebra lineal numérica densa los productos matriz-matriz son los más relevantes. Personalmente no me importa si Eigen o ATLAS son más rápidos. Si Eigen fuera más rápido que ATLAS, usaría Eigen como backend BLAS.
Descargo de responsabilidad: Sí, FLENS es mi bebé! Eso significa que codifiqué alrededor del 95% y cada línea de código valió la pena :-)
fuente
He estado usando GMM ++ por algún tiempo y estoy feliz con eso.
fuente
Básicamente, la misma pregunta apareció en SO:
¿Cuáles son las bibliotecas de álgebra lineal / matemática / matricial lineal de C ++ más utilizadas, y sus compensaciones de costo y beneficio?
(Agrega algo de valor a la respuesta de Geoff).
fuente
¿Cuál sería la mejor biblioteca matricial para manejar matrices de pequeño tamaño, que se usan comúnmente, por ejemplo, al ensamblar matrices de elementos finitos, para realizar operaciones de tensor, etc.
Ya estoy usando PETSc para la solución de los grandes sistemas lineales dispersos que surgen en mi aplicación, pero actualmente estoy usando mi propia biblioteca simple para manejar estas matrices / vectores ... Estoy considerando mudarme a una biblioteca más rápida. como los mencionados anteriormente.
¿Cuál sería la mejor opción para asociarse con PETSc? Eigen? ¿Armadillo? IMPULSO :: uBlas? MTL4? Utilizo algunas cosas de BOOST, así que, primero pensé en usar BOOST :: uBlas, pero no hay mucha documentación, ejemplos, etc.
fuente
Armadillo, Boost y otros ahora se incluyen como parte de Ceemple, un rápido entorno informático técnico C ++ basado en JIT. Disponible (gratis) en http://www.ceemple.com .
fuente
Sorprendido, nadie ha mencionado TooN hasta ahora. Lo he estado usando felizmente por casi 3 años.
Es muy similar a Eigen, aunque no tan completo. Sin embargo, creo que tiene la sintaxis más agradable de alguna manera.
También viene con clases que ayudan a modelar transformaciones comunes que se encuentran con frecuencia en Gráficos y Visión, basadas en Grupos de Mentiras (Euclidiana Especial / Ortogonal en 2 y 3 dimensiones, etc.) y Álgebras de Mentiras asociadas.
fuente
HASEM Matrix C ++ Library es lo que realmente necesita http://sourceforge.net/projects/hasem/
fuente