我几乎所有的数学线性代数工作都习惯于 Eigen。最近,我发现Boost还提供了一个C++模板类库,它提供了基本线性代数库( Boost::uBLAS )。这让我想知道我是否可以仅基于 boost 来完成所有工作,因为它已经是我代码的主要库。
仔细观察两者并没有让我更清楚地区分它们:
- 提升::uBLAS :
uBLAS 为密集、单位和稀疏向量、密集、恒等、三角形、带状、对称、厄米特和稀疏矩阵提供模板化 C++ 类。向量和矩阵的视图可以通过范围、切片、适配器类和间接数组来构建。该库涵盖了向量和矩阵的常用基本线性代数运算:不同范数的约简、向量和矩阵的加法和减法以及与标量的乘法、向量的内积和外积、矩阵向量和矩阵矩阵积以及三角求解器。
…
- 特征:
它支持所有矩阵大小,从小的固定大小矩阵到任意大的密集矩阵,甚至稀疏矩阵。
它支持所有标准数字类型,包括 std::complex、整数,并且可以轻松扩展为自定义数字类型。
它支持各种矩阵分解和几何特征。
其不受支持的模块生态系统提供了许多专业功能,例如非线性优化、矩阵函数、多项式求解器、FFT 等等。
…
有没有人更好地了解它们的主要区别以及我们可以在它们之间进行选择的基础?
原文由 Vtik 发布,翻译遵循 CC BY-SA 4.0 许可协议
我正在重写一个从 boost::uBLAS 到 Eigen 的实质性项目。这是商业环境中的生产代码。我是在 2006 年选择 uBLAS 的人,现在我建议对 Eigen 进行更改。
uBLAS 导致编译器执行的实际向量化非常少。我可以查看大源文件的汇编输出,编译为 amd64 架构,使用 SSE,使用浮点类型,并没有找到单个 ***ps 指令(addps、mulps、subps、4 路打包单精度浮点指令)并且只有 ***ss 指令(addss,…,标量单精度)。
使用 Eigen,编写库以确保产生向量指令。
特征非常完整。有很多矩阵分解和求解器。在 boost::uBLAS 中,LU 分解是一个未记录的附加组件,是一段贡献代码。 Eigen 增加了 3D 几何,例如旋转和四元数,而不是 uBLAS。
uBLAS 在最基本的操作上稍微完整一些。 Eigen 缺少一些东西,例如投影(使用另一个矩阵索引一个矩阵),而 uBLAS 有它。对于两者都具有的功能,Eigen 更简洁,从而使表达式更易于阅读。
那么,uBLAS 就完全过时了。我无法理解在 2016⁄2017 年有人如何看待它。阅读常见问题解答: