最佳稀疏单位矩阵的C++矩阵库

9
我正在寻找一款好的(最好是活跃维护的)C++矩阵库。它应该是模板化的,因为我想使用有理数复合体作为数值类型。我处理的矩阵主要是稀疏和酉的。
您能否建议一些库,并给出一个小的解释为什么要使用它们,因为我知道如何找到它们,但我不能真正决定什么适合我,因为我缺乏对它们的经验。
编辑:
我处理的主要操作是矩阵乘法、向量的标量乘法和Kronecker积。矩阵的大小是指数级别的,我希望至少能够处理1024x1024个条目的矩阵。

你需要矩阵库做什么?基本线性代数、求解器还是其他用途?你的矩阵有多大? - stephan
大部分时间我都在做矩阵乘法、标量乘法和使用克罗内克积。这些矩阵可以相当大,至少我想能够处理1024x1024的矩阵。 - Mathias Soeken
3个回答

10
许多从事“严肃”矩阵工作的人,依赖于 BLAS,添加 LAPACK/ATLAS(普通矩阵)或 UMFPACK(稀疏矩阵)进行更高级别的数学计算。原因是这些代码经过了充分测试,稳定可靠,并且非常快速。此外,您可以直接从供应商(例如 Intel MKL)购买并针对您的架构进行调整,也可以免费获得它们。Manuel's answer 中提到的 uBLAS 可能是标准的 C++ BLAS 实现。如果您以后需要类似于 LAPACK 的东西,则有相应的 bindings
然而,这些标准库(BLAS / LAPACK / ATLAS或uBLAS +绑定+ LAPACK / ATLAS)都不能满足您对模板化和易于使用的要求(除非uBLAS是您所需的全部)。实际上,我必须承认,当我使用BLAS / LAPACK实现时,我经常直接调用C / Fortran接口,因为我通常看不到uBLAS +绑定组合中的太多额外优势。
如果我需要一个易于使用、通用的C++矩阵库,我倾向于使用Eigen(过去我使用NewMat)。优点:
  • 在Intel架构上相当快,对于较小的矩阵可能是最快的
  • 漂亮的界面
  • 几乎包含您从矩阵库期望的所有内容
  • 您可以轻松添加新类型
缺点(个人意见):
  • 单处理器[编辑:Eigen 3.0中部分修复]
  • 对于大矩阵和某些高级数学运算,速度比ATLAS或Intel MKL慢(例如LU分解)[编辑:在Eigen 3.0中也有所改进]
  • 仅支持稀疏矩阵的实验性支持[编辑:即将发布的版本3.1中有所改进]。

编辑:即将发布的Eigen 3.1允许一些函数使用Intel MKL(或任何其他BLAS / LAPACK实现)。


1
C++包装器的一个明显优势是表达式模板提供的性能增益。 - Manuel
Eigen似乎使用从右到左的乘法,这有点奇怪。 - Sard
1
uBLAS不是一个包装器,它完全是用C++实现的。 - rcollyer
@rcollyer:感谢您的建议。这确实措辞不当。我很惊讶您是第一个指出我的错误的人。我唯一能给出的道歉是,我一直将uBLAS与绑定一起使用(因此我的“包装器”观念),这并不是我最喜欢的方法。但您是正确的——我应该记得,因为我们选择不使用uBLAS的原因之一是,对于较大的稠密矩阵,uBLAS的prod比ATLAS的gemm慢得多(如果我没记错的话,Intel MKL会因此重载prod以调用gemm)。 - stephan
我自己从未使用过包装器功能,因为我需要访问内部表示,也无法弄清楚如何添加所需的功能。因此,我选择了CodeSourcery的VSIPL ++实现。 - rcollyer
显示剩余2条评论

4

Boost uBLAS,因为它通过了Boost过滤器。

有一些模板库支持稀疏矩阵,所以如果您没有更具体的需求,很难提出更好的理由。


1

你也应该尝试 MLTHASEM Matrix C++ 库。最后一个非常好文档化。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接