我一直在处理数学密集型代码,需要一个好的矩阵库。我可以使用二维数组,但一个完整的矩阵库(包括乘法、加法等)会更方便。我显然已经用谷歌搜索过了,但这给了我很多选择。我希望一些有经验的程序员的意见能帮助缩小范围。
C++ 有哪些好的免费矩阵/线性代数库?
Eigen是一个非常快速的矩阵操作和线性代数库,它在可用时使用硬件加速。
你可以试试uBlas
功能性
uBLAS 为密集、单位和稀疏向量、密集、恒等、三角形、带状、对称、厄米特和稀疏矩阵提供模板化 C++ 类。向量和矩阵的视图可以通过范围、切片、适配器类和间接数组来构造。该库涵盖了向量和矩阵的常用基本线性代数运算:不同范数的约简、向量和矩阵的加法和减法以及与标量的乘法、向量的内积和外积、矩阵向量和矩阵矩阵积以及三角求解器。容器、视图和表达式模板化操作之间的粘合剂主要是符合 STL 的迭代器接口。
还有IT++,它具有易于使用的语法,类似于 Matlab。Armadillo也有非常相似的语法,但已知它比 IT++ 快得多。(犰狳使用模板元编程,而 IT++ 没有)。Armadillo 和 IT++ 都提供了特征分解、奇异值分解、矩阵求逆等。相比之下,uBlas使用模板元编程来提高速度,但不能做矩阵求逆等。
速度差异锥在权衡不同领域的不同功能组,例如。IT++ 有许多信号处理功能,而Armadillo几乎只专注于线性代数。
这带来了一个相关的观点:图书馆的速度只是其整体有用性或价值的一个因素。例如,你可能有一个非常快的库,但是学习它的 API/语法需要相当长的时间,或者语法很难使用。另一个问题是库中已经存在的功能数量——例如。您可能需要编写自己的函数。您可能还需要考虑该库的目的是简化 Matlab 代码到 C++ 的转换,还是您已经熟悉 Matlab 语法。
鉴于上述几点,您最终可能会花费比运行代码更多的时间进行编码和调试,这最终违背了快速库的目的。换句话说,原始执行速度只是一个因素,不应将其作为整体决定因素。开发时间也是一个非常重要的因素(例如,“产品时间”),不仅从成本角度来看,而且因为更少的编码时间可以让您腾出时间做其他事情。
过去我用过犰狳。我不能说它的速度能力——它是朋友推荐给我的,因为它与 MATLAB 函数和符号有一些相似之处。我没有尝试任何非常密集的事情,但它在我使用它时达到了我的目的。我也听说过关于 uBlas 的好消息,这里也推荐。