Estoy buscando una biblioteca de tensor C ++ que admita código independiente de dimensión. Específicamente, necesito realizar operaciones a lo largo de cada dimensión (hasta 3), por ejemplo, calcular una suma ponderada. Las dimensiones son un parámetro de plantilla (y, por lo tanto, una constante de tiempo de compilación). Otra restricción es que la biblioteca debería ser relativamente liviana, por lo tanto, más bien estilo Eigen / Boost que Trilinos / PETSc.
¿Alguna sugerencia?
Nota: He echado un vistazo a Eigen y creo que casi se ajusta exactamente al perfil, si no se limitara a los tensores 2D. Si me equivoco con esto, corríjame.
Creo que esta nueva
taco
lib también es realmente buena.El compilador de álgebra de tensor (taco) es una biblioteca de C ++ que calcula las expresiones de álgebra de tensor en tensores dispersos y densos. Utiliza nuevas técnicas de compilación para obtener un rendimiento competitivo con núcleos optimizados a mano en bibliotecas ampliamente utilizadas tanto para álgebra de tensor disperso como para álgebra lineal dispersa.
Puede usar taco como una biblioteca de C ++ que le permite cargar tensores, leer tensores de archivos y calcular expresiones de tensor. También puede usar taco como generador de código que genera funciones C que calculan expresiones tensoras.
Discusión: https://www.youtube.com/watch?v=Kffbzf9etLE Documento: http://tensor-compiler.org/kjolstad-oopsla17-tensor-compiler.pdf
fuente
XTensor es un enfoque moderno y se está volviendo cada vez más popular. https://github.com/QuantStack/xtensor
fuente
La biblioteca deal.II ( http://www.dealii.org ), aunque está escrita para propósitos mucho más grandes, también tiene una sub-biblioteca de clases de tensor que probablemente hace mucho de lo que quieres hacer. En particular, utiliza plantillas para la dimensión.
(Descargo de responsabilidad: soy uno de los principales autores de esta biblioteca).
fuente
La biblioteca Boost.Numeric.uBlas agregó recientemente una extensión de tensor que se entrega con Boost versión 1.70. Por favor, eche un vistazo a https://github.com/boostorg/ublas . Proporciona operaciones estándar de matriz y tensor con orden variable en tiempo de ejecución (número de dimensiones), dimensiones para los formatos de almacenamiento de primer y último orden (columnas y filas principales). También puede usar fácilmente la convención de suma de Einstein para expresar multiplicaciones de tensor aribtrary. Boost.Numeric.uBlas es solo encabezado y fácil de integrar en proyectos existentes.
fuente
No lo he usado yo mismo pero libtensor parece cumplir con sus requisitos.
fuente
esta es una biblioteca C ++ de matriz multidimensional https://github.com/ContinuumIO/libdynd
fuente
LTensor ( https://code.google.com/p/ltensor/ ) es una biblioteca de plantillas C ++ MUY fácil de usar para tensores hasta el rango 4 (basado en notación índica), rápida y liviana también. No necesita compilar nada, solo debe incluir el archivo de encabezado principal. Lo he usado en varios proyectos y funcionó bien.
Tiene algunas características integradas para tensores de rango 2 como solucionadores lineales, svd, LU y descomposiciones Cholesky, etc. No utilicé ninguna de ellas (utilizo otras bibliotecas para eso).
fuente
También hay ITensor (requiere C ++ 17).
fuente