轻量级/免安装基于 C 或 C++ 的密集线性代数求解器的建议

计算科学 线性求解器 图书馆 C++ C
2021-11-27 07:15:03

我的大部分编程都是一次性的 C 研究代码,供我自己使用。除了亲密的合作者之外,我从未将任何代码分发给其他人。我开发了一种算法,并将其发表在科学期刊上。我想在文章的在线补充中提供源代码,也许还有可执行代码。一位同事要求我对需要我用 C++ 编写(ack!)并且需要我解决小型密集线性系统的算法进行概括。如果我成功地获得了该算法的用户群,部分原因是使用它的入口栏很低(就像在地板上一样)。潜在用户不会为了使用代码而安装库等。我希望代码完全独立,不受任何许可证的限制。我可能会简单地通过从 Golub 和 van Loan 中取出一些东西来编写自己的求解器,但我宁愿使用其他人已经编写的普通求解器(如果有的话)。建议表示赞赏。谢谢!

3个回答

我建议将 Lapack 接口完全复制到您需要的功能,很可能您只需要dgesv. 这样,安装了 Lapack 的人可以简单地链接到它,它就可以正常工作。对于没有安装 Lapack 的人,您可以提供自己的此功能的简单实现,或者可能按照其他人的建议使用 Eigen 或 FLENS 实现它。

在 Fortran 领域,Lapack 库是一个标准,大多数人只是简单地使用它,仅此而已,而不是提供自己的实现。

许多人在开始科学计算时犯的一个很早的错误就是假设您需要用同一种语言编写所有代码。我认为这主要是由于历史原因,当时尚不清楚如何使已编译的程序在同一编译器的甚至版本之间相互通信。也就是说,在这种情况下,如果您仍然要使用 C++,那么有几个非常好的 C++ 仅标头模板库可能适合您的需求。

由于您出于学术原因分发代码,并且您希望将密集线性代数求解器嵌入到您的代码中,因此我强烈建议您考虑EigenEigen 已根据 Mozilla Public License 获得许可,并且是一个仅限标头的库。这意味着您可以使用源代码形式分发 Eigen(这不会对您的代码施加任何许可限制),并且您将获得对其一般功能的访问权限,包括极其高效的密集线性求解器。正如 GertVdE 所提到的,您还有其他几个选择

如果您想要一个可靠的线性方程组求解器,我会推荐FLENS它包含对 LAPACK 的精确重新实现(如果使用单线程 BLAS 实现,它甚至会重现与 LAPACK 相同的舍入误差)。这适用于所有FLENS-LAPACK函数(连同大约 100 个例程的实用函数)。

FLENS 采用 BSD 许可证,因此可以合并到专有产品中。

FLENS 只是标题,如果您只需要 FLENS 的一个子集,我可以为您提供一个精简版本,其中仅包含您需要的那些功能。FLENS 带有自己的参考 BLAS 实现。但您的用户可以选择链接到优化的 BLAS 库,如 ATLAS、OpenBLAS 或 GotoBALS。对于大型矩阵,与 Eigen 相比,这提供了大约 40% 的性能增益。

是的,Eigen 还使用 LAPACK 测试套件来检查他们的结果。他们为 3 个函数(对称矩阵的 Lu、Cholesky 和特征值/-向量)执行此操作。但是,他们对非对称矩阵的特征值/向量的计算将无法通过 LAPACK 测试套件。

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