到目前为止,我从在线研究中收集了以下信息:
我用过一点犰狳,发现界面足够直观,很容易找到 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和其他软件包主要关注线性系统的求解,而求解线性系统是我现在最不关心的问题。(也许稍后,我将需要该功能,它可能对其他人有用。)