Boost::uBLAS与Eigen的比较

23
I am used to using Eigen for almost all of my mathematical linear algebra work. Recently, I discovered that Boost also provides a C++ template class library that includes the Basic Linear Algebra Library (Boost::uBLAS). This made me wonder if I could do all my work based solely on Boost since it is already a major library for my code.
Upon closer inspection, I couldn't really distinguish between them:
- Boost::uBLAS: uBLAS provides templated C++ classes for dense, unit and sparse vectors, dense, identity, triangular, banded, symmetric, hermitian and sparse matrices. Views into vectors and matrices can be constructed via ranges, slices, adaptor classes and indirect arrays. The library covers the usual basic linear algebra operations on vectors and matrices: reductions like different norms, addition and subtraction of vectors and matrices and multiplication with a scalar, inner and outer products of vectors, matrix vector and matrix matrix products and triangular solver.
- Eigen:
它支持所有矩阵大小,从小型固定大小的矩阵到任意大的密集矩阵,甚至是稀疏矩阵。它支持所有标准数字类型,包括std::complex、整数,并且易于扩展到自定义数字类型。它支持各种矩阵分解和几何特征。其未支持模块的生态系统提供了许多专业功能,如非线性优化、矩阵函数、多项式求解器、FFT等等。... 有没有人对它们的关键区别有更好的想法,以及我们可以根据什么基础在它们之间进行选择?
3个回答

16
我正在将一个重要的项目从boost::uBLAS重写到Eigen。这是商业环境下的生产代码。我曾在2006年选择了uBLAS,现在建议切换到Eigen。 uBLAS导致编译器几乎没有实际进行任何向量化处理。我可以查看使用float类型,在amd64架构上编译成大型源文件的汇编输出,却找不到一个单独的***ps指令(addps、mulps、subps,4路打包单精度浮点指令),只有***ss指令(addss,...,标量单精度)。
使用Eigen库,确保得出向量指令。
Eigen非常功能齐全。有很多矩阵分解和求解器。在boost::uBLAS中,LU分解是未记录的附加功能,是一段贡献的代码片段。Eigen增加了3D几何学的内容,如旋转和四元数,而uBLAS则没有。 uBLAS在最基本的操作上略微更完整。Eigen缺少某些东西,比如投影(使用另一个矩阵索引矩阵),而uBLAS具有此功能。对于两者都具有的功能,Eigen更简洁,表达式更易读。
而uBLAS已经完全过时了。我无法理解在2016/2017年还有人会考虑使用它。请阅读常见问题解答:

问:我应该在新项目中使用uBLAS吗?

A: 截至撰写时(09/2012),有许多优秀的矩阵库可用,例如MTL4、armadillo和eigen。uBLAS提供了一组稳定、经过充分测试的向量和矩阵类、线性代数的典型操作以及用于解三角形方程组的求解器。uBLAS提供了密集、结构化和稀疏矩阵——所有这些都使用相似的接口。最后,uBLAS具有良好(但不是卓越的)性能。另一方面,uBLAS的最后一次主要改进是在2008年,自2009年以来没有做出任何重大更改。因此,人们应该自问一些问题来帮助决策:可用性?uBLAS是boost的一部分,因此在许多环境中可用。易于使用?对于简单的事情,uBLAS很容易使用,但当您离开该路径时,需要相当的C++知识。性能?有更快的替代品。前沿技术?uBLAS已有十多年历史,并错过了C++11中的所有新功能。

6
我刚刚对boost和eigen进行了时间复杂度比较,用于相当琐碎的矩阵计算。这些结果虽然有限,但似乎表明boost是一个更好的选择。 我有一个FEM代码,它执行预处理部分(设置元素矩阵并将它们拼接在一起)。因此,这自然会涉及大量的内存分配。

enter image description here

我在C++(gcc 5.4.0,ubuntu 16.04,Intel i3四核,2.40GHz,RAM:4Gb)上使用Boost和Eigen编写了相同的代码,并针对不同的节点大小(N)分别运行它们,并使用linux cl-utility计算时间。 就我个人而言,我决定继续使用Boost。


内存分配是否会影响结果? - hamster on wheels
6
你在这里进行的是哪种操作? - myradio
13
你应该绝对展示这个基准测试的来源! - Synxis
不幸的是,源代码是一个相当大的工程(文件集),所以我不指望任何人去仔细查看。但进行的操作包括: (1)使用8x8子矩阵构建大小为NxN的大矩阵。 (2)从“拼接”的NxN矩阵中删除特定的行和列。 - Nidish Narayanaa

1

Eigen同样使用表达式模板。 - quant_dev
2
请注意,这些基准测试相当古老(来自2011年),且不是独立的。 - quant_dev

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