2016-05-14 116 views
5

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

在两个仔细一看真的没有让我他们之间的明确区分:

  • 的boost :: uBLAS库:

的uBLAS提供密集,单元模板C++类和稀疏矢量,密集,身份,三角形,带状,对称,厄密和稀疏矩阵。可以通过范围,切片,适配器类和间接阵列构建向量和矩阵的视图。该库涵盖了关于向量和矩阵的常用基本线性代数运算:像不同规范的减法,向量和矩阵的加法和减法,以及与向量的内积和外积,矩阵向量和矩阵矩阵乘积以及三角求解器的乘积。

...

  • 征:

它支持所有的矩阵大小,从小型固定大小的矩阵来任意大的密集矩阵,甚至稀疏矩阵。它支持所有标准数字类型,包括std :: complex,整数,并且可以轻松扩展到自定义数字类型。

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

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

...

有谁对他们的主要差别,并在此基础上更好的主意,我们可以在它们之间进行选择?

回答

2

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

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

+0

Eigen也使用表达模板。 –

+0

@quant_dev我说得更清楚了。 – kangshiyin

+0

请注意,这些基准很旧(从2011年开始),而不是独立的。 –

1

我只是做了提升和本征之间的相当琐碎的矩阵计算的时间复杂度比较。这些结果虽然有限,但似乎表明助推是一种更好的选择。 我有一个FEM代码,它执行预处理部分(设置元素矩阵并将它们拼接在一起)。自然,这将涉及大量的内存分配。

enter image description here

我写代码的相同件与升压和本征上C++(GCC 5.4.0,ubuntu的16.04,英特尔的i3四核处理器,2。40GHz,RAM:4Gb),并使用linux cl-utility单独运行它们以获得不同的节点大小(N)和计算时间。 就我而言,我决定在Boost中继续使用我的代码。

+0

内存分配是否会影响结果? –

+4

你在这里执行的操作是什么? – myradio

+1

你一定要显示这个基准的来源! – Synxis