2010-10-18 13 views
10

Estoy buscando asesoramiento sobre bibliotecas/clases de matriz multidimensional de alto rendimiento para C++. Lo que realmente necesito es:Arrays multidimensionales C++ de alto rendimiento

  • la capacidad de asignar dinámicamente las matrices con un tamaño determinado en tiempo de ejecución

  • la capacidad de acceder y modificar valores de matriz individuales (rápidas)

  • a ser capaz de utilizar matriz simple aritmética tal como array1 = array2 + 2 * array3

  • una biblioteca bien mantenido

me he encontrado con varias bibliotecas, incluyendo:

  • Blitz++, que es exactamente lo que necesito, pero que no parece muy bien mantenido (última versión estable fue hace 5 años)

  • Boost, que no es compatible con aritmética de matriz, y parece ser bastante lento en comparación con decir Blitz ++.

  • Jonn Bowman's array.h que no tiene documentación.

¿Alguien tiene alguna otra sugerencia o comentario sobre las opciones anteriores?

+0

Gracias por las respuestas. Solo para aclarar, no me interesan el álgebra lineal, solo los contenedores de matriz y las operaciones aritméticas simples. – astrofrog

Respuesta

2
  • uBlas, una parte de Boost. Ofrece niveles completos de BLAS 1-3 y, por lo tanto, muchas funciones aritméticas de matriz.
  • Armadillo también parece ser una biblioteca de álgebra lineal C++, que por lo que puedo ver utiliza opcionalmente LAPACK/Atlas (que por supuesto lo hace canónicamente rápido).
  • El GNU Scientific Library ofrece BLAS completo. No sé qué tan rápido es, o si puede usar LAPACK/Atlas.
  • Si no necesita nada más elegante que lo que enumera, puede fácilmente envolver, por ejemplo, Atlas 'BLAS usted mismo. Pero probablemente no desee reinventar la rueda si no es necesario.
3

Hay una encuesta amplia y relativamente reciente, que incluye puntos de referencia, here.

Creo que puede acelerar Boost.UBlas vinculándolo a bibliotecas numéricas subyacentes como LAPACK o Intel MKL, pero no lo he hecho.

fwiw, las implementaciones que parecen surgir más a menudo como candidatos son Boost.UBlas y MTL. Según mi experiencia, es más probable que una adopción amplia fomente el apoyo y el desarrollo continuos.

4

Eigen está muy bien mantenido (en este momento, al menos, hay nuevas versiones que salen todos los meses) y es compatible con las otras operaciones que necesita.

+2

Eigen no parece admitir matrices multidimensionales. – Ran

+3

Eigen (maestro) ahora tiene una biblioteca de tensores con todas las funciones (matrices multidimensionales) – iNFINITEi

0

Desde una perspectiva de rendimiento, he intentado boost :: MultiArray y Armadillo. Ninguno fue rápido, ya que ambos tenían un tiempo de acceso lento en comparación con arreglos o vectores, y pude vencer estos paquetes en una operación como x1 (4:10) = x2 (1: 6) + x2 (2: 7) + x2 (3: 8) mediante el uso de un simple bucle codificado a mano (con la ayuda de la optimización de mi compilador, estoy seguro). Cuando entre en la multiplicación de la matriz, estos paquetes pueden ofrecer algún beneficio a través de LAPACK y BLAS, pero siempre puede usar esas interfaces por su cuenta.

0

Con la advertencia de que esto es auto-promoción descarada,

https://github.com/ndarray/ndarray

puede ser vale la pena analizar.

Si bien no proporciona operadores matemáticos optimizados, proporciona una interfaz a Eigen para eso. Donde realmente se destaca es en proporcionar interoperabilidad con Python/NumPy a través de SWIG o Boost.Python.

0

También otro auto-promoción descarada,

https://github.com/dwwork/FortCpp/

He publicado mi propia solución personal a este problema hasta en GitHub. No soy un experto en C++ de ninguna manera, pero pensé que al menos lo tiraría por ahí.

2

Necomi parece proporcionar las características que desea.

Incluye soporte para un número arbitrario multidimensional cuyas dimensiones se pueden fijar en tiempo de ejecución, proporciona un acceso rápido a elementos individuales, al tiempo que admite expresiones aritméticas (entre otras).

Cuestiones relacionadas