稀疏矩阵超定线性方程组 c/c++ 库

Posted

技术标签:

【中文标题】稀疏矩阵超定线性方程组 c/c++ 库【英文标题】:sparse matrix overdetermined linear equation system c/c++ library 【发布时间】:2011-10-29 14:55:50 【问题描述】:

我需要一个库来解决 Ax=b 系统,其中 A 是一个非对称稀疏矩阵,每行有 8 个条目(它可能非常大)。我认为实现双共轭渐变的库应该没问题,但我找不到一个有效的库(我尝试过 iml++,但 iml++/sparselib++ 包中缺少一些头文件)。有什么建议吗?

【问题讨论】:

你看过boost.org/doc/libs/1_47_0/libs/numeric/ublas/doc/index.htm吗? 是的,但我认为 ublas 只是一个模板库,我看不到任何解决稀疏系统的迭代方法,我错了吗? 有一个稀疏矩阵类。我还没有详细了解是否有求解器,但你可能想看看boost.org/doc/libs/1_47_0/libs/numeric/ublas/doc/… 看看里面是否有你可以使用的东西。 是的,我已经阅读了该页面,但我怀疑是否有任何求解器 【参考方案1】:

存在处理超定系统的标准方法。例如Wikipedia 是这样说的:

一组线性联立方程可以用矩阵形式写成 Ax = y。如果方程多于变量,则系统称为超定系统,并且(通常)没有解。然后系统可以更改为 (ATA)x = ATy。新系统具有与变量一样多的方程(矩阵 ATA 是方阵),并且可以用通常的方式求解。该解是原始超定系统的最小二乘解,最小化欧几里得范数||Ax − y||,这是原始系统中两侧差异的度量。

因此您可以使用任何标准的方阵稀疏求解器。

我个人使用 Tim Davis 的 CSparse 的直接求解器。 Tim 编写了许多优秀的直接稀疏求解器。事实上,他的UMFPACK 是另一个很好的选择,例如被 MATLAB 使用。请注意,这两个求解器都提供 C 接口。如果您正在寻找具有本机 C++ 接口的东西,那么我无能为力。

我对迭代求解器有一些经验。但是,我发现对于我正在研究的问题,迭代方法对于大型矩阵变得不稳定。我在直接求解器方面取得了更大的成功。当然,根据您的问题引发的矩阵类型,您完全有可能获得相反的体验。

【讨论】:

非常感谢,这很有帮助,我现在正在使用 umfpack(制作一个 Visual Studio 项目来编译它很烦人:D),它似乎工作正常 但是,还有一个问题.. 给定 A,我如何使用 umfpack 解决 A^tAx = A^tb?我的意思是,umfpack 是否给了我一种计算 A^tA 和 A^tb 的方法,或者我必须自己相乘? (用A^t,我的意思是转置A) 我不熟悉 UMFPACK 例程。正如我所说,我使用CSparse,因为自相矛盾的是,最简单的算法似乎对我的问题表现最好。但我相信你需要自己形成 A^tA 和 A^tb 。当然,CSparse 有做这些产品的例程。我希望 UMFPACK 也会这样做。 我现在正在为 umfpack 使用 eigen 的 (eigen.tuxfamily.org/index.php?title=Main_Page) 绑定,它在我需要的稀疏矩阵上实现了一些操作,并允许我使用干净的接口调用 umfpack 函数,感谢您的帮助跨度> 【参考方案2】:

看起来ARPACK 解决了稀疏非对称矩阵问题。有C++版本

【讨论】:

ARPACK 是一个特征求解器。这很棒,但问题涉及不同的问题。【参考方案3】:

对于大卫赫弗南的回答:不要忘记一件重要的事情:必须检查/证明矩阵 A 具有线性独立的列,否则可能会发生 (A^T A) 是奇异的(然后它当然不起作用)。

【讨论】:

以上是关于稀疏矩阵超定线性方程组 c/c++ 库的主要内容,如果未能解决你的问题,请参考以下文章

超定线性方程组Ax=b极小L1范数求解——MATLAB/Python实现

超定线性方程组Ax=b极小L1范数求解——MATLAB/Python实现

线性方程组的迭代解法——超松弛迭代法

线性方程组的迭代解法

Python数值计算基础

矩阵线性代数笔记整理汇总,超全面