una tridimensionales sumar programas matriz matrices hacer como bidimensionales arreglos c++ multidimensional-array

tridimensionales - Arreglos multidimensionales C++ de alto rendimiento



matrices en c (8)

Con la advertencia de que esto es autopromoción desvergonzada,

https://github.com/ndarray/ndarray

puede valer la pena investigar.

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.

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

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

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

  • para poder usar aritmética de matriz simple como array1 = array2 + 2 * array3

  • una biblioteca bien mantenida

Me he encontrado con varias bibliotecas, que incluyen:

  • Blitz ++ , que se ve exactamente lo que necesito, pero que no parece muy bien mantenido (la ú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 ++.

  • La matriz de Jonn Bowman.h que no tiene documentación.

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


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.


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

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.



También otra autopromoción desvergonzada,

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

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


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


Necomi parece proporcionar las características que te gustaría.

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, y también admite expresiones aritméticas (entre otras).


  • 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 de C ++, que hasta donde puedo ver utiliza opcionalmente LAPACK / Atlas (que por supuesto lo hace canónicamente rápido).
  • La Biblioteca Científica GNU ofrece BLAS completo. No sé qué tan rápido es, o si puede usar LAPACK / Atlas.
  • Si no necesitas algo más elegante que lo que enlistas, puedes envolver fácilmente, por ejemplo, el BLAS de Atlas. Pero probablemente no desee reinventar la rueda si no es necesario.