Boost::uBLAS vs Eigen

新手上路,请多包涵

我几乎所有的数学线性代数工作都习惯于 Eigen。最近,我发现Boost还提供了一个C++模板类库,它提供了基本线性代数库( Boost::uBLAS )。这让我想知道我是否可以仅基于 boost 来完成所有工作,因为它已经是我代码的主要库。

仔细观察两者并没有让我更清楚地区分它们:

  • 提升::uBLAS :

uBLAS 为密集、单位和稀疏向量、密集、恒等、三角形、带状、对称、厄米特和稀疏矩阵提供模板化 C++ 类。向量和矩阵的视图可以通过范围、切片、适配器类和间接数组来构建。该库涵盖了向量和矩阵的常用基本线性代数运算:不同范数的约简、向量和矩阵的加法和减法以及与标量的乘法、向量的内积和外积、矩阵向量和矩阵矩阵积以及三角求解器。

  • 特征:

它支持所有矩阵大小,从小的固定大小矩阵到任意大的密集矩阵,甚至稀疏矩阵。

它支持所有标准数字类型,包括 std::complex、整数,并且可以轻松扩展为自定义数字类型。

它支持各种矩阵分解和几何特征。

其不受支持的模块生态系统提供了许多专业功能,例如非线性优化、矩阵函数、多项式求解器、FFT 等等。

有没有人更好地了解它们的主要区别以及我们可以在它们之间进行选择的基础?

原文由 Vtik 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.3k
1 个回答

我正在重写一个从 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 就完全过时了。我无法理解在 20162017 年有人如何看待它。阅读常见问题解答:

问:我应该将 uBLAS 用于新项目吗?答:在撰写本文时 (09/2012) 有很多好的矩阵库可用,例如 MTL4、armadillo、eigen。 uBLAS 提供了一组稳定的、经过良好测试的向量和矩阵类、线性代数的典型运算和三角方程组的求解器。 uBLAS 提供密集的、结构化的和稀疏的矩阵——所有这些都使用类似的接口。最后,uBLAS 提供了良好(但并不出色)的性能。另一方面,uBLAS 的最后一次重大改进是在 2008 年,自 2009 年以来没有做出任何重大改变。所以应该问自己一些问题来帮助做出决定:可用性? uBLAS 是 boost 的一部分,因此可在许多环境中使用。便于使用? uBLAS 很容易用于简单的事情,但是当你离开路径时需要良好的 C++ 知识。表现?有更快的选择。前沿? uBLAS 已有 10 多年的历史,错过了 C++11 的所有新内容。

原文由 migle 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题