我正在寻找一个支持维度无关代码的C ++张量库。具体来说,我需要沿每个维度(最多3个)执行操作,例如,计算加权和。尺寸是模板参数(因此是编译时常数)。另一个限制是该库应该相对轻量级,因此本征/ Boost样式要比Trilinos / PETSc轻。
有什么建议么?
注意:我查看了Eigen,并认为它几乎完全符合轮廓,如果它不限于2D张量。如果我对此感到误解,请纠正我。
我正在寻找一个支持维度无关代码的C ++张量库。具体来说,我需要沿每个维度(最多3个)执行操作,例如,计算加权和。尺寸是模板参数(因此是编译时常数)。另一个限制是该库应该相对轻量级,因此本征/ Boost样式要比Trilinos / PETSc轻。
有什么建议么?
注意:我查看了Eigen,并认为它几乎完全符合轮廓,如果它不限于2D张量。如果我对此感到误解,请纠正我。
Answers:
就其价值而言,Eigen确实将Tensor类作为不受支持的模块。
http://eigen.tuxfamily.org/dox-devel/unsupported/group_ CXX11 _Tensor__Module.html
我自己没有使用过,所以不能多说。
Armadillo类库具有三阶张量类。
我也没有使用过Armadillo的张量功能,但是我已经尝试了标准矩阵类,它们似乎相对易于使用并且性能良好。
我认为这个新taco
库确实也很好。
Tensor Algebra Compiler(taco)是一个C ++库,用于计算稀疏和密集张量上的张量代数表达式。它使用新颖的编译器技术,与稀疏张量代数和稀疏线性代数广泛使用的库中的手动优化内核在性能上具有竞争力。
您可以将taco用作C ++库,使您可以加载张量,从文件中读取张量以及计算张量表达式。您也可以将taco用作代码生成器,该代码生成器生成计算张量表达式的C函数。
谈话:https://www.youtube.com/watch?v = Kffbzf9etLE 论文:http://tensor-compiler.org/kjolstad-oopsla17-tensor-compiler.pdf
XTensor是一种现代方法,并且越来越受欢迎。 https://github.com/QuantStack/xtensor
Deal.II库(http://www.dealii.org)虽然是为更大的目的而编写的,但它也具有张量类的子库,该类库可能会完成很多您想做的事情。特别是,它使用尺寸模板。
(免责声明:我是该库的主要作者之一。)
Boost.Numeric.uBlas库最近添加了一个张量扩展,它随Boost 1.70一起提供。请查看https://github.com/boostorg/ublas。它提供标准矩阵和张量运算,并具有运行时可变的顺序(维数),一阶和最后一阶存储格式(列和行主)的尺寸。您还可以轻松地使用爱因斯坦求和约定来表示ribtraryry张量乘法。Boost.Numeric.uBlas仅是标头,易于集成到现有项目中。
这是多维数组C ++库https://github.com/ContinuumIO/libdynd
LTensor(https://code.google.com/p/ltensor/)是一种非常易于使用的C ++模板库,可用于快速且轻量级(最高4级)的张量(基于符号)。您不需要编译任何东西,只需要包含主头文件即可。我已经在几个项目上使用它,并且工作正常。
它具有一些用于2级张量的内置功能,例如线性求解器,svd,LU和Cholesky分解等。我没有使用任何功能(为此我使用了其他库)。
也有ITensor(需要C ++ 17)。