Boost :: uBLAS vs本征

c++ boost eigen

5766 观看

3回复

2312 作者的声誉

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

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

  • Boost :: uBLAS:

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

...

  • 本征

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

它支持所有标准数字类型,包括std :: complex,整数,并且很容易扩展到自定义数字类型。

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

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

...

有谁对他们的主要区别有更好的主意,我们可以在哪个基础上进行选择?

作者: Vtik 的来源 发布者: 2016 年 5 月 14 日

回应 (3)


2

8791 作者的声誉

如果您关心表达模板引入的性能和性能提升,请选择Eigen;如果只想学习表达模板,请选择uBlas。

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

作者: kangshiyin 发布者: 14.05.2016 01:57

4

100 作者的声誉

我只是在boost和特征值之间进行了时间复杂度比较,以进行比较琐碎的矩阵计算。这些结果尽管有限,但似乎表明增强效果是更好的选择。我有一个FEM代码,用于执行预处理部分(设置元素矩阵并将它们缝合在一起)。所以自然地,这将涉及大量的内存分配。

在此处输入图片说明

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

作者: Nidish Narayanaa 发布者: 02.02.2017 04:45

4

712 作者的声誉

我正在将一个大项目从boost :: uBLAS重写到Eigen。这是商业环境中的生产代码。我是2006年选择uBLAS的人,现在建议将其更改为Eigen。

uBLAS导致编译器执行的实际矢量化非常少。我可以使用浮点类型查看使用SSE编译为amd64架构的大型源文件的程序集输出,而找不到单个*** ps指令(addps,mulps,subps,4路打包单精度浮点)指令)和仅*** ss指令(加法,...,标量单精度)。

使用Eigen,将编写库以确保产生矢量指令。

本征非常完整。有很多矩阵分解和求解器。在boost :: uBLAS中,LU因式分解是一个未记录的附件,是一段有用的代码。本征具有3D几何的附加功能,例如旋转和四元数,而不是uBLAS。

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

然后,uBLAS完全过时了。我不明白有人在2016/2017年如何看待它。阅读常见问题解答:

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

作者: migle 发布者: 10.10.2018 11:03
32x32