我有一个(n x n)的对称矩阵A和一个(n x 1)的向量B。基本上,我只需要求解Ax = b以得到x。问题是A可能很大。因此,我正在寻找在C++中解线性方程组最有效的算法。我查看了Eigen库。显然它有一个SVD方法,但我被告知它很慢。解决x=inverse(A)*b也似乎不是最优解。uBLAS更快吗?还有其他更有效的方法吗?谢谢。
编辑:矩阵A是正定且非稀疏的。
编辑:矩阵A是正定且非稀疏的。
解决形如 Ax = b
的线性方程组的最佳方法是按照以下步骤进行:
A
分解为格式为 A = M1 * M2
(其中 M1
和 M2
是三角形的)M1 * y = b
,得到 y
M2 * x = y
,得到 x
对于 方阵 ,第一步将使用LU分解。
对于非方阵,第一步将使用QR分解。
如果矩阵A是正定且不稀疏,则第一步将使用Cholesky分解。
如果您想使用Eigen,则必须首先将其分解,然后三角形求解。
如果仍然很慢,幸运的是,有许多线性代数库可用于提高性能。您应该寻找的程序是dpotrs
。以下是一些实现了此功能的库:
如果在整个项目中使用 eigen,您可以根据此处的介绍,将需要的 LAPACK 例程与之接口。