一个用于数组、矩阵、向量和经典线性代数操作的C++库

10

你使用哪个库来处理 N 维数组?

我在工作中使用 Blitz++,但我很不喜欢它的某些方面。例如在使用 operator= 之前需要重新调整大小,对于一个 (0,0) 的矩阵,A(Range::all(), Range::all()) 的操作会抛出异常等等。此外,其线性代数运算需要使用 Clapack 库。

我曾经使用过并且很喜欢 Eigen。它提供了“全头文件”实现、C++ 语法糖以及我需要的所有线性代数运算(如矩阵乘法、系统解析、Cholesky 分解等)。

你使用的是什么库?


我感觉你在询问人们用于数学数组的库,而不是“C++数组”?如果是这样,你应该考虑在问题中更具体地表达 :) - larsmoa
为什么你想要针对数组进行“基本矩阵操作”?也许你的问题应该是关于矩阵类的。 - jalf
类似clapack这样的东西有什么问题吗?(或者为什么它太“笨重”了?)你要找什么并不是很清楚。 - jalf
为什么不考虑使用Eigen(http://eigen.tuxfamily.org)?它看起来速度快且文档完善。 - denis
这个库支持线性代数。请参见此处:https://gitlab.com/correaa/boost-multi/-/blob/master/include/multi/adaptors/blas/test/gemv.cpp#L62-65 - alfC
3个回答

7

2
如果您正在使用带有-std=c++0x的gcc,则使用或std::array。 - coelhudo
boost的多维数组速度很慢,请参见https://dev59.com/L3RB5IYBdhLWcg3w-8E9 - denis

3

我也在一些项目中使用armadillo。以下是它们网站上的介绍:

Armadillo是一个C++线性代数库(矩阵数学),旨在实现速度和易用性之间的良好平衡。支持整数、浮点数和复数,以及一些三角函数和统计函数的子集。通过与LAPACK和ATLAS库的可选集成,提供各种矩阵分解。

采用延迟评估方法(在编译时)将多个操作合并为一个,并减少(或消除)临时变量的需求。这是通过递归模板和模板元编程实现的。

如果已经决定使用C++作为首选语言(由于速度和/或集成能力),而不是像Matlab®或Octave这样的其他语言,则此库非常有用。它在开源和商业环境下都有用的许可证。

Armadillo主要由NICTA(澳大利亚)开发,来自世界各地的人贡献。


1
+1 看起来不错,"平衡很好"。 有人将其速度与 Blitz、Numpy 进行了比较吗? 例如在 www.scipy.org/PerformancePython laplace.py 中? - denis
1
+1 对于经验比较的需求。我们需要某种库来收集不同编译器、操作系统等的结果。 - Dirk Eddelbuettel

2
我们已成功地使用TNT数年了。然而,有足够的问题,我们现在正朝着内部开发的解决方案迈进。对我们来说最大的两个难点是:
  • 数组即使只是进行读取访问,也不是线程安全的,因为它们使用了非线程安全的引用计数。
  • 当你编写const正确的代码时,这些数组会导致各种各样的问题。

如果这些问题不是问题的话,那么它们对于许多常见的数组任务来说还是相当方便的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接