我习惯于几乎所有数学线性代数工作的Eigen。 最近,我发现Boost还提供了一个C ++模板类库,它提供了Basic Linear Algebra Library(Boost::uBLAS)。这让我想知道我是否可以仅使用boost来完成所有工作,因为它已经是我的代码的主要库。
仔细观察两者并没有让我更清楚地区分它们:
uBLAS为密集,单位和稀疏向量,密集,同一性,三角形,带状,对称,埃尔米特和稀疏矩阵提供模板化C ++类。可以通过范围,切片,适配器类和间接数组构建对向量和矩阵的视图。该库涵盖了矢量和矩阵的常用基本线性代数运算:不同规范的减少,向量和矩阵的加法和减法,以及向量的标量,内部和外部乘积,矩阵向量和矩阵矩阵乘积以及三角形求解器的乘法。 / p>
...
它支持所有矩阵大小,从小的固定大小矩阵到任意大的密集矩阵,甚至是稀疏矩阵。
它支持所有标准数字类型,包括std :: complex,整数,并且可以轻松扩展为自定义数字类型。
它支持各种矩阵分解和几何特征。
其不受支持的模块生态系统提供了许多专业功能,如非线性优化,矩阵函数,多项式求解器,FFT等等。
...
有没有人对他们的主要差异有更好的了解,我们可以在哪些基础上做出选择?
答案 0 :(得分:4)
我只是对相当平凡的矩阵计算进行了增强和本征之间的时间复杂度比较。这些结果虽然有限,但似乎表明增强是一种更好的选择。 我有一个FEM代码,它执行预处理部分(设置元素矩阵并将它们拼接在一起)。很自然地,这将涉及大量的内存分配。
我在C ++(gcc 5.4.0,ubuntu 16.04,Intel i3四核,2.40GHz,RAM:4Gb)上使用Boost和Eigen编写了相同的代码片段,并针对不同的节点大小(N)和计算时间分别运行它们使用linux cl-utility。 就我而言,我决定继续使用Boost中的代码。
答案 1 :(得分:3)
我正在将一个大项目从boost :: uBLAS重写到Eigen。这是商业环境中的生产代码。我是2006年选择uBLAS的人,现在建议将其更改为Eigen。
uBLAS导致编译器执行的实际矢量化非常少。我可以使用浮点类型查看使用SSE编译为amd64架构的大型源文件的程序集输出,而找不到单个*** ps指令(addps,mulps,subps,4路打包单精度浮点)指令)和仅*** ss指令(加法,...,标量单精度)。
使用Eigen编写库,以确保产生矢量指令。
本征非常完整。有很多矩阵分解和求解器。在boost :: uBLAS中,LU因式分解是一个未记录的附件,是一段有用的代码。 Eigen为3D几何添加了附加功能,例如旋转和四元数,而不是uBLAS。
在最基本的操作上,uBLAS更为完整。本征缺少某些东西,例如投影(使用另一个矩阵索引一个矩阵),而uBLAS却拥有。对于两者都有的功能,Eigen更为简洁,从而使表达式更易于阅读。
然后,uBLAS完全过时了。我不明白有人在2016/2017年如何看待它。阅读常见问题解答:
问:我应该在新项目中使用uBLAS吗? 答:在撰写本文时(09/2012),有很多好的矩阵库可供使用,例如MTL4,犰狳,本征。 uBLAS提供了一组经过稳定测试的向量和矩阵类,这是线性代数的典型运算以及三角方程组的求解器。 uBLAS提供密集,结构化和稀疏的矩阵-所有这些都使用相似的接口。最后,uBLAS提供了良好(但不是出色)的性能。另一方面,uBLAS的最后一项重大改进是在2008年,自2009年以来未进行任何重大更改。因此,应该问自己一些问题以帮助做出决定:可用性? uBLAS是增强技术的一部分,因此可在许多环境中使用。易于使用? uBLAS易于用于简单的事情,但是当您离开这条路时,它需要相当的C ++知识。性能?有更快的选择。前沿? uBLAS已有10多年的历史了,错过了C ++ 11的所有新功能。
答案 2 :(得分:2)
如果您关心表达式模板引入的性能和性能增益,请选择Eigen,如果您只想学习表达式模板,请选择uBlas。