Boost :: uBLAS vs Eigen

Vti*_*tik 12 c++ boost eigen

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

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

  • Boost :: uBLAS:

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

...

  • 特征:

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

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

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

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

...

有没有人对他们的关键差异有更好的了解,我们可以在哪些基础上做出选择?

mig*_*gle 13

我正在重写一个从 boost::uBLAS 到 Eigen 的实质性项目。这是商业环境中的生产代码。我是 2006 年选择 uBLAS 的人,现在推荐更改为 Eigen。

uBLAS 导致编译器执行的实际矢量化非常少。我可以看看大源文件的汇编输出,编译成amd64架构,带SSE,使用float类型,没有找到一条***ps指令(addps,mulps,subps,4waypacked single-precision floating point指令)并且只有 ***ss 指令(addss,...,标量单精度)。

使用 Eigen,编写库以确保向量指令结果。

Eigen 功能非常齐全。有很多矩阵分解和求解器。在 boost::uBLAS 中,LU 分解是一个未记录的附加组件,是一段贡献的代码。Eigen 添加了 3D 几何体,例如旋转和四元数,而不是 uBLAS。

uBLAS 在最基本的操作上稍微完整一些。Eigen 缺少一些东西,例如投影(使用另一个矩阵索引一个矩阵),而 uBLAS 有它。对于两者都具有的功能,Eigen 更简洁,从而使表达式更易于阅读。

然后,uBLAS 就完全陈旧了。我无法理解任何人在 2016/2017 年如何看待它。阅读常见问题:

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


Nid*_*naa 6

我只是对 boost 和 eigen 之间相当简单的矩阵计算进行了时间复杂度比较。这些结果尽管有限,但似乎表明 boost 是更好的选择。我有一个 FEM 代码,它负责预处理部分(设置元素矩阵并将它们缝合在一起)。当然,这会涉及大量的内存分配。

在此输入图像描述

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

  • 您绝对应该展示此基准测试的来源! (13认同)
  • 您在这里进行的是什么操作? (6认同)

kan*_*yin 1

如果您关心表达式模板带来的性能和性能增益,请选择 Eigen;如果您只想学习表达式模板,请选择 uBlas。

http://eigen.tuxfamily.org/index.php?title=Benchmark

  • 请注意,这些基准测试相当古老(从 2011 年开始)并且不是独立的。 (2认同)