¿Cuáles son las bibliotecas de álgebra lineal/matemática vectorial/matricial de C++ más utilizadas, y sus compensaciones de costo y beneficio? [cerrado]


Parece que muchos proyectos poco a poco se topan con la necesidad de hacer matemáticas matriciales, y caen en la trampa de construir primero algunas clases vectoriales y agregar lentamente funcionalidad hasta que quedan atrapados construyendo una biblioteca de álgebra lineal personalizada a medias, y dependiendo de ella.

Me gustaría evitar eso mientras no construya en una dependencia de alguna biblioteca tangencialmente relacionada (por ejemplo, OpenCV, OpenSceneGraph).

¿ Cuáles son las bibliotecas de matemáticas matriciales/álgebra lineal comúnmente utilizadas?, ¿y por qué decidiría usar uno sobre otro? ¿Hay alguno que se desaconseja usar por alguna razón? Estoy usando esto específicamente en un contexto geométrico/temporal* (2,3,4 Dim) * pero puede estar usando datos dimensionales más altos en el futuro.

Estoy buscando diferencias con respecto a cualquiera de: API, velocidad, uso de memoria, amplitud/integridad, estrechez/especificidad, extensibilidad y/o madurez/estabilidad.

Actualizar

Terminé usando Eigen3 que estoy extremadamente feliz con.

Author: halfer, 2009-09-04

11 answers

Hay bastantes proyectos que se han asentado en el Generic Graphics Toolkit para esto. El GMTL allí es agradable-es bastante pequeño, muy funcional, y se ha utilizado ampliamente lo suficiente como para ser muy confiable. OpenSG, VRJuggler y otros proyectos han cambiado a usar esto en lugar de sus propias matemáticas vertor/matrix hechas a mano.

Me ha parecido bastante agradable, lo hace todo a través de plantillas, por lo que es muy flexible y muy rápido.


Editar:

Después la discusión de los comentarios y las ediciones, pensé en arrojar algo más de información sobre los beneficios y desventajas de implementaciones específicas, y por qué podría elegir una sobre la otra, dada su situación.

GMTL -

Beneficios: API simple, diseñada específicamente para motores gráficos. Incluye muchos tipos primitivos orientados al renderizado (como planos, AABB, quatenriones con interpolación múltiple, etc.) que no están en ningún otro paquete. Memoria muy baja gastos generales, bastante rápido, fácil de usar.

Desventajas: La API está muy enfocada específicamente en el renderizado y los gráficos. No incluye matrices de propósito general (NxM), descomposición y resolución de matrices, etc., ya que están fuera del ámbito de las aplicaciones gráficas/geometrías tradicionales.

Eigen -

Beneficios: API limpia, bastante fácil de usar. Incluye un módulo de geometría con cuaterniones y transformaciones geométricas. Sobrecarga de memoria baja. Completo, alto rendimiento resolución de matrices NxN grandes y otras rutinas matemáticas de propósito general.

Desventajas: Puede ser un alcance un poco más grande de lo que quieres (?). Menos rutinas geométricas / renderizadas específicas en comparación con GMTL (es decir, definiciones de ángulo de Euler, etc.).

IMSL -

Beneficios: Biblioteca numérica muy completa. Muy, muy rápido (supuestamente el solucionador más rápido). Con mucho, la API matemática más grande y completa. Apoyo comercial, maduro y estable.

Desventajas: Costo - no barato. Muy pocos métodos geométricos / de representación específicos, por lo que tendrá que rodar su propio en la parte superior de sus clases de álgebra lineal.

NT2 -

Beneficios: Proporciona una sintaxis más familiar si está acostumbrado a MATLAB. Proporciona descomposición completa y resolución de matrices grandes, etc.

Desventajas: Matemático, no centrado en el renderizado. Probablemente no tan eficiente como Eigen.

LAPACK -

Beneficios: Algoritmos muy estables y probados. Ha estado por aquí por mucho tiempo. Resolución completa de matrices, etc. Muchas opciones para las matemáticas oscuras.

Desventajas: No tan alto rendimiento en algunos casos. Portado desde Fortran, con API impar para su uso.

Personalmente, para mí, todo se reduce a una sola pregunta: ¿cómo planeas usar esto? Si te centras solo en el renderizado y los gráficos, me gusta Generic Graphics Toolkit, ya que funciona bien y admite muchas operaciones de renderizado útiles listas para usar sin tener que implementar las suyas propias. Si necesita resolver matrices de propósito general (es decir: descomposición SVD o LU de matrices grandes), iría con Eigen, ya que maneja eso, proporciona algunas operaciones geométricas y es muy eficiente con soluciones de matrices grandes. Es posible que tenga que escribir más de sus propios gráficos / operaciones geométricas (en la parte superior de sus matrices/vectores), pero eso no es horrible.

 104
Author: Reed Copsey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-15 18:05:35

Así que soy una persona bastante crítica, y me imagino que si voy a invertir en una biblioteca, será mejor que sepa en qué me estoy metiendo. Me imagino que es mejor ir pesado en la crítica y la luz en la adulación al escudriñar; lo que está mal en él tiene muchas más implicaciones para el futuro de lo que es correcto. Así que voy a ir por la borda aquí un poco para proporcionar el tipo de respuesta que me habría ayudado y espero que ayude a otros que pueden viajar por este camino. Tenga en cuenta que esto se basa en la poca revisión/pruebas que he hecho con estas libs. Y robé algo de la descripción positiva de Reed.

Mencionaré arriba que fui con GMTL a pesar de su idiosincrasia porque la falta de seguridad de Eigen2 era una desventaja demasiado grande. Pero recientemente he aprendido que la próxima versión de Eigen2 contendrá definiciones que apagarán el código de alineación y lo harán seguro. Así que puedo cambiar.

Actualización: He cambiado a Eigen3. A pesar de su idiosincrasia, su alcance y elegancia son demasiado difíciles de ignorar, y las optimizaciones que lo hacen inseguro se pueden desactivar con una definición.

Eigen2 / Eigen3

Beneficios: LGPL MPL2, API limpia, bien diseñada, bastante fácil de usar. Parece estar bien mantenido con una comunidad vibrante. Sobrecarga de memoria baja. Alto rendimiento. Hecho para álgebra lineal general, pero buena funcionalidad geométrica disponible también. Todo el encabezado lib, no se requiere vinculación.

Idiocyncracies / desventajas: (Algunos / todos estos pueden evitarse mediante algunas definiciones que están disponibles en la rama de desarrollo actual Eigen3)

  • Las optimizaciones de rendimiento inseguras hacen necesario seguir cuidadosamente las reglas. El incumplimiento de las reglas causa bloqueos.
    • simplemente no puede pasar por valor de forma segura
    • el uso de tipos propios como miembros requiere una personalización especial del asignador (o se bloquea)
    • uso con tipos de contenedores stl y posiblemente otras plantillas requeridas personalización de asignación especial (o se bloqueará)
    • ciertos compiladores necesitan un cuidado especial para evitar bloqueos en las llamadas a funciones (ventanas GCC)

GMTL

Beneficios: LGPL, API bastante simple, diseñada específicamente para motores gráficos. Incluye muchos tipos primitivos orientados hacia el renderizado (como planos, AABB, quatenriones con interpolación múltiple, etc.) que no están en ningún otro paquete. Sobrecarga de memoria muy baja, bastante rápido, fácil de usar. Todo basado en encabezado, no es necesario enlazar.

Idiocyncracies / desventajas:

  • API es peculiar
    • lo que podría ser myVec.x () en otra lib solo está disponible a través de myVec[0] (Problema de legibilidad)
      • un array o stl:: vector de puntos puede hacer que hagas algo como pointsList[0] [0] para acceder al componente x del primer punto
    • en un intento ingenuo de optimización, eliminado cruz (vec, vec) y reemplazado con makeCross (vec,vec,vec) cuando el compilador elimina temps innecesarios de todos modos
    • las operaciones matemáticas normales no devuelven tipos normales a menos que cierre off algunas características de optimización, por ejemplo: vec1 - vec2 no devuelve un vector normal so length( vecA - vecB ) falla aunque vecC = vecA - vecB funciona. Debes envolver como: length( Vec( vecA - vecB ) )
    • las operaciones en vectores son proporcionadas por funciones externas en lugar de miembro. Esto puede requerir que use la resolución de alcance en todas partes desde común los nombres de los símbolos pueden chocar
    • tienes que hacer
        length( makeCross( vecA, vecB ) )
      o
        gmtl::length( gmtl::makeCross( vecA, vecB ) )
      donde de lo contrario podría intentar
        vecA.cross( vecB ).length()
  • no está bien mantenido
    • todavía reclamado como " beta"
    • a la documentación le falta información básica como qué encabezados se necesitan para utilice el functionalty normal
      • Vec.h no contiene operaciones para vectores, VecOps.h contiene algunos, otros están en Generar.h por ejemplo. cruz (vec&, vec&, vec&) en VecOps.h, [make]cross (vec&,vec&) en Generate.h
  • API inmadura / inestable; sigue cambiando.
    • Por ejemplo "cruz "se ha movido de" VecOps.h "para" Generar.h", y luego el nombre fue cambiado a "makeCross". Ejemplos de documentación fallan porque todavía se refieren a versiones antiguas de funciones que ya no existen.

NT2 {[18]]}

No se puede decir porque parecen estar más interesados en el encabezado de la imagen fractal de su página web que el contenido. Parece más un proyecto académico que un proyecto de software serio.

Último lanzamiento hace más de 2 años.

Aparentemente no hay documentación en inglés, aunque supuestamente hay algo en francés en alguna parte.

No se puede encontrar un rastro de una comunidad alrededor del proyecto.

LAPACK & BLAS

Beneficios: Viejos y maduros.

Desventajas:

  • viejos como dinosaurios con APIs de mierda
 31
Author: Catskul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-06 23:53:59

Si está buscando matriz de alto rendimiento/álgebra lineal/optimización en procesadores Intel, miraría la biblioteca MKL de Intel.

MKL está cuidadosamente optimizado para un rendimiento rápido en tiempo de ejecución, en gran parte basado en los estándares BLAS/LAPACK fortran muy maduros. Y su rendimiento se escala con el número de núcleos disponibles. La escalabilidad manos libres con núcleos disponibles es el futuro de la computación y no usaría ninguna biblioteca de matemáticas para un nuevo proyecto que no admita múltiples núcleos procesador.

Muy brevemente, incluye:

  1. Vector-vector básico, vector-matriz, y operaciones matriz-matriz
  2. Factorización matricial (descomposición de LU, hermitiana,escasa)
  3. Problemas de ajuste de mínimos cuadrados y valores propios
  4. Solucionadores de sistemas lineales dispersos
  5. Solucionador de mínimos cuadrados no lineal (regiones de confianza)
  6. Además de rutinas de procesamiento de señales como FFT y convolución
  7. Generadores de números aleatorios muy rápidos (mersenne twist)
  8. Mucho mas.... ver: texto de enlace

Un inconveniente es que la API MKL puede ser bastante compleja dependiendo de las rutinas que necesite. También puede echar un vistazo a su biblioteca IPP (Integrated Performance Primitives), que está orientada a operaciones de procesamiento de imágenes de alto rendimiento, pero sin embargo es bastante amplia.

Paul

Software del espacio central, bibliotecas matemáticas. NET, centerspace.net

 11
Author: Paul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-10-15 05:38:03

Por si sirve de algo, he probado Eigen y Armadillo. A continuación se presenta una breve evaluación.

Propio Ventaja: 1. Completamente autónomo no sin dependencia de BLAS o LAPACK externos. 2. Documentación decente. 3. Supuestamente rápido, aunque no lo he puesto a prueba.

Desventaja: El algoritmo QR devuelve una sola matriz, con la matriz R incrustada en el triángulo superior. Ni idea de dónde viene el resto de la matriz, y ninguna matriz Q puede ser acceder.

Armadillo Ventaja: 1. Amplia gama de descomposiciones y otras funciones (incluyendo QR). 2. Razonablemente rápido (utiliza plantillas de expresión), pero de nuevo, realmente no lo he empujado a dimensiones altas.

Desventajas: 1. Depende de BLAS externas y / o LAPACK para descomposiciones matriciales. 2. Falta documentación en MI humilde opinión (incluyendo los detalles de wrt LAPACK, aparte de cambiar una instrucción #define).

Sería bueno si una biblioteca de código abierto estuviera disponible que es autónomo y fácil de usar. Me he encontrado con este mismo problema durante 10 años, y se vuelve frustrante. En un momento, usé GSL para C y escribí envoltorios de C++ a su alrededor, pero con C++ moderno, especialmente usando las ventajas de las plantillas de expresión, no deberíamos tener que meternos con C en el siglo 21. Sólo mi tuppencehapenny.

 11
Author: Francis Urquhart,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-01 19:13:06

He oído cosas buenas sobre Eigen y NT2, pero no he usado personalmente tampoco. También hay Boost.UBLAS, que creo que se está haciendo un poco largo en el diente. Los desarrolladores de NT2 están construyendo la próxima versión con la intención de ponerlo en Boost, por lo que podría contar para algo.

Mi lin. alg. las necesidades no se extienden más allá del caso de la matriz 4x4, por lo que no puedo comentar sobre la funcionalidad avanzada; solo estoy señalando algunas opciones.
 8
Author: Jeff Hardy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-04 16:53:06

Soy nuevo en este tema, así que no puedo decir mucho, pero BLAS es más o menos el estándar en computación científica. BLAS es en realidad un estándar de API, que tiene muchas implementaciones. Honestamente no estoy seguro de qué implementaciones son más populares o por qué.

Si desea también ser capaz de hacer operaciones de álgebra lineal común (solución de sistemas, regresión de mínimos cuadrados, descomposición, etc.) mira en LAPACK .

 8
Author: davidtbernal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-04 16:56:36

¿Qué pasa con GLM?

Está basado en la especificación OpenGL Shading Language (GLSL) y publicado bajo la licencia MIT. Claramente dirigido a programadores gráficos

 6
Author: user3742582,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-21 14:46:25

Agregaré vote por Eigen: Porté mucho código (geometría 3D, álgebra lineal y ecuaciones diferenciales) de diferentes bibliotecas a esta, mejorando tanto el rendimiento como la legibilidad del código en casi todos los casos.

Una ventaja que no se mencionó: es muy fácil usar SSE con Eigen, lo que mejora significativamente el rendimiento de las operaciones 2D-3D (donde todo se puede rellenar a 128 bits).

 5
Author: ima,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-16 13:48:38

Vale, creo que sé lo que estás buscando. Parece que GGT es una solución bastante buena, como sugirió Reed Copsey.

Personalmente, lanzamos nuestra pequeña biblioteca, porque nos ocupamos mucho de los puntos racionales, muchos NURBS y Béziers racionales.

Resulta que la mayoría de las bibliotecas de gráficos 3D hacen cálculos con puntos proyectivos que no tienen base en matemáticas proyectivas, porque eso es lo que te da la respuesta que quieres. Terminamos usando puntos Grassmann, que tienen un sólida base teórica y disminuyó el número de tipos de puntos. Los puntos de Grassmann son básicamente los mismos cálculos que la gente está usando ahora, con el beneficio de una teoría robusta. Lo más importante, hace las cosas más claras en nuestras mentes, por lo que tenemos menos errores. Ron Goldman escribió un artículo sobre los puntos de Grassmann en gráficos por computadora llamado "Sobre los Fundamentos Algebraicos y Geométricos de los Gráficos por Computadora".

No está directamente relacionado con su pregunta, pero es interesante Leer.

 4
Author: tfinniga,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-04 20:56:58

FLENS

Http://flens.sf.net

También implementa muchas funciones LAPACK.

 0
Author: Michael Lehn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-03 13:43:21

Encontré esta biblioteca bastante simple y funcional ( http://kirillsprograms.com/top_Vectors.php ). Estos son vectores de hueso desnudo implementados a través de plantillas de C++. No hay cosas de lujo-solo lo que necesita hacer con vectores (sumar, restar multiplicar, punto, etc.).

 0
Author: Clark Gamble,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-24 21:23:08