2008-12-12 17 views
15

Necesitaría algunos constructos matemáticos vectoriales básicos en una aplicación. Punto producto, producto cruzado. Encontrar la intersección de líneas, ese tipo de cosas.Biblioteca C++ de código abierto para matemáticas vectoriales

Puedo hacer esto solo (de hecho, ya lo he hecho) pero ¿no hay un "estándar" para usarlo, por lo que los errores y posibles optimizaciones no estarían en mí?

Boost no lo tiene. Su parte de matemáticas se trata de funciones estadísticas, hasta donde pude ver.

Adición:

Boost 1.37 de hecho parece tener this. También introducen con gracia una serie de otras soluciones en el campo, y por qué todavía fueron e hicieron las suyas. Me gusta eso.

+0

ver mi comentario a continuación - impulsar el álgebra lineal ha estado presente desde al menos 1,29. – tgamblin

+1

esta pregunta fue hecha hace más de 4 años. Hay algunas actualizaciones? – nkint

Respuesta

10

Vuelva a verificar ese viejo amigo de los programadores de C++ llamado Boost. Tiene a linear algebra package que bien se adapta a sus necesidades.

+0

Parece que esa parte está solo en la nueva rama 1.37, pero voy a echar un vistazo. ¡¡Gracias!! – akauppi

+0

Estoy bastante seguro de que boost :: numeric :: ublas ha existido desde 1.29 o antes. Su enlace es solo para 1.37. – tgamblin

+0

de hecho, la primera versión está en 1.29, como está escrita por tgamblin: ver en la parte inferior de la página: http://www.boost.org/doc/libs/1_37_0 –

1

Compruebe www.netlib.org, que es mantenido por Oak Ridge National Lab y la Universidad de Tennessee. Puede buscar paquetes numéricos allí. También está Numerical Recipes in C++, que tiene un código que lo acompaña, pero la versión C++ del libro es algo costosa y he escuchado el código descrito como "terrible". Las versiones C y FORTRAN son gratuitas, y el código asociado es bastante bueno.

+0

Además de ser generalmente débil, el código de Numerical Recipes también tiene una licencia impar asociada a su uso. –

+0

Al usar el código de Recetas numéricas en C, tenga cuidado con las declaraciones de 'salida' en el código. Me llevó algo de tiempo descubrir por qué mi aplicación a veces "se colgaba" por esto. – foraidt

+0

Sobre el libro en sí, diría que está bien escrito y explica tanto sobre un problema como sea necesario. Con respecto al código provisto, estoy de acuerdo con David. – foraidt

2

Me mantendría alejado de usar el código de NRC para cualquier cosa que no sea aprender los conceptos.

Creo que lo que busca es Blitz++

+0

claramente Blitz ++ tiene un rendimiento inferior con respecto a otros: http://eigen.tuxfamily.org/index.php?title=Benchmark –

+1

Depende del tamaño y tipo del vector. Para vectores pequeños cuya longitud se conoce en tiempo de compilación, Blitz ++ puede generar código desenrollado para productos de puntos, etc., que no se puede superar. Los vectores grandes, donde el mosaico y el almacenamiento en caché es de la mayor importancia, es una cuestión diferente. –

0

Para álgebra lineal: tratar JAMA/TNT. Eso cubriría productos dot. (+ factorización de matrices y otras cosas) En cuanto a productos vectoriales cruzados (realmente válidos solo para 3D, de lo contrario creo que entrarás en tensores), no estoy seguro.

11

No lo he probado, pero el C++ eigen library es cada vez más popular en estos días. Según ellos, están a la par con las bibliotecas más rápidas de los alrededores y su API me parece bastante clara.

+0

Eche un vistazo a algunos puntos de referencia en http://eigen.tuxfamily.org/index.php?title=Benchmark – gnud

0

Para obtener una biblioteca extremadamente liviana (archivo .h solo), consulte CImg. Está orientado al procesamiento de imágenes, pero no tiene problemas para manejar vectores.

5

Armadillo

Armadillo emplea un enfoque retardada evaluación combinar varias operaciones en uno y reducir (o eliminar) la necesidad para temporales. Donde aplicable, el orden de las operaciones es optimizado. La evaluación diferida y la optimización se logran a través de las plantillas recursivas y la metaprogramación de la plantilla .

Mientras que las operaciones encadenadas como suma, resta y multiplicación (matriz y elemento-wise) son los principales objetivos para oportunidades de aceleración, otros operaciones, tales como la manipulación de submatrices, también puede ser optimizado . Se tuvo cuidado de mantener la eficiencia para matrices "pequeñas" y "grandes".

Cuestiones relacionadas