8

我正在寻找一个好的(最好是积极维护的)C++ 矩阵库。因此它应该被模板化,因为我想使用一个复杂的有理数作为数字类型。我正在处理的矩阵主要是稀疏和单一的。

能否请您推荐一些库,并简要说明为什么要使用它们,因为我知道如何找到它们,但我无法真正决定什么适合我,因为我错过了使用它们的经验。

编辑:

我处理的主要操作是矩阵乘法与向量的标量乘法kronecker 积。矩阵的大小是指数级的,我希望至少能够处理高达 1024x1024 条目的矩阵。

4

3 回答 3

10

许多人在做“严肃”矩阵的事情,依靠BLAS,添加LAPACK / ATLAS(正常矩阵)或UMFPACK(稀疏矩阵)以获得更高级的数学。原因是这段代码经过了良好的测试、稳定、可靠且速度相当快。此外,您可以直接从针对您的架构调整的供应商(例如英特尔 MKL)购买它们,也可以免费获得它们。Manuel 的回答中提到的uBLAS可能是标准的 C++ BLAS 实现。如果您以后需要 LAPACK 之类的东西,可以使用绑定

但是,这些标准库(BLAS / LAPACK / ATLAS 或 uBLAS + bindings + 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 允许某些功能使用英特尔 MKL(或任何其他 BLAS / LAPACK 实现)。

于 2010-02-08T16:15:47.923 回答
4

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

有一些模板库支持稀疏矩阵,因此如果您对自己的需求没有更具体的要求,就很难找到更好的理由。

于 2010-02-08T15:26:17.520 回答
1

您还应该尝试MLTHASEM矩阵 C++ 库。最后一个是有据可查的。

于 2012-02-14T15:58:18.253 回答