推荐一个可用的、快速的 C++ 矩阵库?

计算科学 线性代数 软件 隐式方法
2021-12-12 19:18:11

有没有人推荐一个可用的、快速的 C++ 矩阵库?

我所说的可用是指:

  • 矩阵对象具有直观的界面(例如:我可以在索引时使用行和列)
  • 我可以用 LAPACK 和 BLAS 做的矩阵类做任何事情
  • 易于学习和使用的 API
  • 在 Linux 中安装相对轻松(我现在使用 Ubuntu 11.04)

对我来说,为了避免过早的优化,可用性现在比速度或内存使用更重要。在编写代码时,我总是可以使用一维数组(或 STL 向量)和适当的索引或指针算法来模拟矩阵,但为了避免错误,我不希望这样做。我还想把我的精力集中在我试图解决的实际问题上并编程到问题域中,而不是用我有限的注意力来记住我用来将矩阵模拟为数组的所有小编程技巧,并记住 LAPACK 命令等。另外,我要写的代码越少,越标准化越好。

密集与稀疏并不重要。我正在处理的一些矩阵将是稀疏的,但不是全部。然而,如果一个特定的包能很好地处理密集或稀疏矩阵,那就值得一提了。

模板对我来说也不重要,因为我将使用标准数字类型,不需要存储除双精度数、浮点数或整数以外的任何内容。这很好,但对于我想做的事情来说不是必需的。

4个回答

到目前为止,我从在线研究中收集了以下信息:

我用过一点犰狳,发现界面足够直观,很容易找到 Ubuntu 的二进制包(我假设是其他 Linux 发行版)。我没有从源代码编译它,但我希望它不会太难。它符合我的大部分设计标准,并使用密集线性代数。它可以调用 LAPACK 或 MKL 例程。通常不需要编译 Armadillo,它是一个纯粹的基于模板的库:您只需包含头文件并链接到 BLAS/LAPACK 或 MKL 等。

我听说过有关Eigen的好消息,但没有使用它。声称速度很快,使用模板,并支持密集线性代数。它没有 LAPACK 或 BLAS 作为依赖项,但似乎能够做 LAPACK 可以做的所有事情(加上一些 LAPACK 不能做的事情)。很多项目都使用 Eigen,这是有希望的。它有一个适用于 Ubuntu 的二进制包,但作为一个只有头文件的库,在其他地方使用也很简单。

Matrix Template Library版本 4 看起来也很有前途,并且使用了模板它同时支持密集和稀疏线性代数,并且可以将UMFPACK称为稀疏求解器。他们的网站上的功能有些不清楚。它有一个适用于 Ubuntu 的二进制包,可从他们的网站下载。

PETSc由 Argonne 国家实验室的一个团队编写,可以使用稀疏和密集的线性求解器,所以我假设它可以用作矩阵库。它是用 C 编写的,但我认为它具有 C++ 绑定(即使没有,从 C++ 调用 C 也没问题)。文档非常详尽。该软件包对于我现在想做的事情(矩阵乘法和索引以设置混合整数线性程序)来说有点矫枉过正,但将来可能对我或其他有不同需求的人有用比我做的。

Trilinos由桑迪亚国家实验室的一个团队编写,通过其 Epetra 组件为密集和稀疏矩阵提供面向对象的 C++ 接口,并通过其 Tpetra 组件为密集和稀疏矩阵提供模板化接口。它还具有提供线性求解器和特征求解器功能的组件。文档似乎不像 PETSc 那样精美或突出;Trilinos 看起来像是 PETSc 的桑迪亚类似物。PETSc 可以调用一些 Trilinos 求解器。Trilinos 的二进制文件可用于 Linux。

Blitz是一个具有 Linux 二进制文件的 C++ 面向对象库。它似乎没有被积极维护(2012-06-29:昨天刚刚出现了一个新版本!),虽然邮件列表是活跃的,所以有一些社区在使用它。它似乎在 BLAS 之外的数值线性代数方面做得并不多,看起来像一个密集的矩阵库。它使用模板。

Boost::uBLAS是一个 C++ 面向对象的库,也是 Boost 项目的一部分。它支持模板和密集数值线性代数。听说不是特别快。

Template Numerical Toolkit是 NIST 开发的C++ 面向对象库。它的作者 Roldan Pozo 似乎偶尔会提供补丁,但它似乎不再处于积极开发中(最后一次更新是 2010 年)。它专注于密集线性代数,并为一些基本的矩阵分解和特征值求解器提供接口。

Elemental由 Jack Poulson 开发,是一个分布式内存(并行)密集线性代数软件包,其编写风格类似于FLAME有关该项目的功能和背景列表,请参阅他的文档FLAME 本身有一个用于顺序和共享内存密集线性代数的关联库,称为libflame,它似乎是用面向对象的 C 语言编写的。Libflame 看起来很像 LAPACK,但在算法基础上有更好的表示法,可以开发快速数值线性代数图书馆更多的是一门科学,而不是一门黑色艺术。

还有其他库可以添加到列表中;如果我们将稀疏线性代数包算作“矩阵库”,那么我所知道的 C 语言中最好的免费包是SuiteSparse,它以面向对象的风格编程。我用过 SuiteSparse,发现它很容易上手;对于将稀疏问题分解为许多小的、密集的线性代数子问题的算法,它依赖于 BLAS 和 LAPACK。该软件包的主要作者 Tim Davis 非常乐于助人,而且是一个全能的好人。

Harwell 子例程库以其稀疏的线性代数例程而闻名,并且对学术用户免费,尽管您必须完成填写表格并为要下载的每个文件接收电子邮件的过程。由于子程序通常具有依赖关系,使用一个求解器可能需要下载五六个文件,并且该过程可能会变得有些乏味,特别是因为表单批准不是即时的。

还有其他稀疏线性代数求解器,但据我所知,MUMPS和其他软件包主要关注线性系统的求解,而求解线性系统是我现在最不关心的问题。(也许稍后,我将需要该功能,它可能对其他人有用。)

本文档于 2009 年 3 月编写,旨在帮助为科学图书馆选择线性代数库。它评估了几个库的可移植性、高级接口和许可,其中包括 Eigen、GSL、Lapack++ MTL、PETSc、Trilinos 和 uBlas。它似乎特别喜欢弗伦斯谢顿(其中一项要求是必须支持 C++ 模板和稀疏矩阵。)

在上面列出的所有项目中,实际上只有两个重量级项目被广泛使用(并且有充分的理由):PETSc 和 Trilinos。两者都是专业开发的,并拥有庞大的开发人员基础。与这两个相比,所有其他项目都是相当小的项目,我建议您使用它们,因为(i)它们将在很长一段时间内得到支持,并且(ii)它们可能已经拥有您需要的所有功能线性代数(以及更多)。

如果你想

  • 具有直观界面的矩阵类
  • 所有 LAPACK 和 BLAS 功能
  • 易于学习和使用的 API
  • 易于安装

然后我建议你看看我的图书馆FLENS我为这类任务设计了它。但是,它需要符合 C++11 的编译器(例如 gcc 4.7 或 clang)。

FLENS 为您提供与底层 BLAS 实现完全相同的性能。 有一些(相当旧的)基准显示了这一点

FLENS-LAPACK 也是如此,如果使用相同的 BLAS 实现,它只会为您提供与 Netlib 的 LAPACK 完全相同的性能。

关于新的基准,让我更详细地介绍......

前段时间,我问 Clint Whaley(ATLAS 的作者)他对 Eigen 网站上发布的基准测试有何看法。他刚刚证实了我的怀疑,这些基准很可能不可靠。与此同时,克林特建议的其他一些已实现的基准。详细信息可在 ATLAS 网站和 Eigen 邮件列表中找到。基准在图表中没有很好地呈现,但它们表明 ATLAS 总是比 Eigen 快 40% 左右。这与 Eigen 站点的基准相矛盾,但证实了其他基准(例如来自 blaze-lib 的基准)。

请注意,对于密集数值线性代数,矩阵-矩阵乘积是最相关的。就我个人而言,我不在乎 Eigen 或 ATLAS 是否更快。如果 Eigen 比 ATLAS 快,那么我会使用 Eigen 作为 BLAS 后端。

免责声明:是的,FLENS 是我的宝贝!这意味着我编写了大约 95% 的代码,每一行代码都是值得的 :-)