到目前为止,我已经从在线研究中收集了以下内容:
我稍微使用了Armadillo,发现界面足够直观,并且很容易找到Ubuntu的二进制包(并且我假设使用其他Linux发行版)。我还没有从源头上编译它,但是我希望它不会太困难。它符合我的大多数设计标准,并使用密集的线性代数。它可以调用LAPACK或MKL例程。通常不需要编译Armadillo,它是一个纯粹基于模板的库:您只需包含标头并链接到BLAS / LAPACK或MKL等。
我听说过关于Eigen的好事,但是还没有使用过。它声称是快速的,使用模板,并支持密集的线性代数。它没有LAPACK或BLAS作为依赖项,但是似乎能够完成LAPACK可以做的所有事情(加上LAPACK不能做的一些事情)。许多项目使用Eigen,这很有希望。它具有适用于Ubuntu的二进制程序包,但作为仅标头的库,在其他地方使用也很简单。
该矩阵模板库版本4也看起来很有希望,并使用模板。它支持稠密和稀疏线性代数,并且可以将UMFPACK称为稀疏求解器。这些功能在他们的网站上还不清楚。它具有Ubuntu的二进制程序包,可从其网站下载。
由Argonne国家实验室的团队编写的PETSc可以访问稀疏和密集的线性求解器,因此我假设它可以用作矩阵库。我认为它是用C编写的,但是具有C ++绑定(即使没有,从C ++调用C也没问题)。该文档非常详尽。该软件包对于我现在想做的事情(矩阵乘法和建立混合整数线性程序的索引)有点过大了,但是将来可能对我或其他有不同需求的人有用比我好
Trilinos,由一组在Sandia国家实验室写入,提供面向对象的C ++接口通过其Epetra部件密集和稀疏矩阵,并通过其Tpetra部件密集和稀疏矩阵模板化接口。它还具有提供线性求解器和本征求解器功能的组件。该文档似乎不像PETSc那样精美或突出。Trilinos看起来像PETSc的Sandia类似物。PETSc可以调用某些Trilinos解算器。Trilinos的二进制文件可用于Linux。
Blitz是具有Linux二进制文件的C ++面向对象库。它似乎没有得到积极维护(2012-06-29:昨天刚刚发布了一个新版本!),尽管邮件列表处于活动状态,所以有一些社区正在使用它。它似乎并没有像BLAS那样在数值线性代数方面做得太多,并且看起来像一个密集的矩阵库。它使用模板。
Boost :: uBLAS是一个C ++面向对象的库,是Boost项目的一部分。它支持模板化和密集的数值线性代数。我听说这不是特别快。
该模板数值工具包是由NIST开发的C ++面向对象的库。它的作者Roldan Pozo似乎偶尔会贡献补丁,但是它似乎不再处于活跃状态(最新更新是2010年)。它专注于稠密的线性代数,并提供一些基本矩阵分解和特征值求解器的接口。
由Jack Poulson开发的Elemental是一种分布式存储器(并行)密集线性代数软件包,以类似于FLAME的样式编写。有关该项目的功能和背景的列表,请参阅他的文档。FLAME本身具有一个用于顺序和共享内存的密集线性代数的相关库,称为libflame,它似乎是用面向对象的C语言编写的。Libflame看起来很像LAPACK,但是在算法上有更好的表示法以进行快速数值运算线性代数库更多地是一门科学,而更少的是一门妖术。
可以将其他库添加到列表中。如果我们将稀疏线性代数包算作 “矩阵库”,我在C语言中所知最好的免费套件是SuiteSparse,它是面向对象风格的。我用过SuiteSparse,发现拿起来很容易。它依赖BLAS和LAPACK来将稀疏问题分解为许多小的,密集的线性代数子问题的算法。该软件包的主要作者蒂姆·戴维斯(Tim Davis)非常乐于助人,是个非常有才华的人。
该哈威尔子程序库是著名的稀疏线性代数程序,并且可用于学术用户,但你必须要经过填表和接收电子邮件为要下载的每个文件的过程。由于子例程通常具有依赖性,因此使用一个求解器可能需要下载五个或六个文件,并且该过程可能会变得有些乏味,特别是因为表单批准不是即时的。
还有其他稀疏的线性代数求解器,但据我所知,MUMPS和其他软件包主要集中在线性系统的求解上,而现在解决线性系统是我最不关心的问题。(也许以后,我将需要该功能,并且对其他人可能很有用。)