我有一个(n×n)对称矩阵A和一个(n×1)向量B.基本上,我只需要求解Ax = b为x。问题是A可能会很大。所以我正在寻找最有效的C ++求解线性方程的算法。我查看了Eigen库。显然它有一个SVD方法,但我被告知它很慢。解决x =逆(A)* b似乎也不是最理想的。 uBLAS更快吗?有没有更有效的方法?谢谢。
编辑:矩阵A是正定的而不是稀疏的。
答案 0 :(得分:40)
解决Ax = b
形式的线性方程组的最佳方法是执行以下操作。
A
分解为格式A = M1 * M2
(其中M1
和M2
为三角形)M1 * y = b
y
M2 * x = y
x
对于方形矩阵,第1步将使用LU Decomposition。
对于非方形矩阵,第1步将使用QR Decomposition。
如果矩阵A 肯定而非稀疏,则第一步使用Cholesky Decomposition。
如果你想使用eigen,你必须先decompose it然后triangular solve。
如果这仍然很慢,谢天谢地,有许多可用的线性代数库可以帮助提高性能。您应该寻找的例程是dpotrs
。一些实现此功能的库如下:
如果您在整个项目中使用eigen,则可以按照here所述的方式连接您需要的LAPACK例程。