C++ 求解线性方程组的最有效方法
我有一个(nxn)对称矩阵A和一个(nx1)向量B。基本上,我只需要解x的Ax=B。问题在于,一场危机可能会是巨大的。因此,我在寻找C++中求解线性方程组的最有效算法。我浏览了艾根图书馆。显然它有一个SVD方法,但我被告知它很慢。解x=逆(A)*b似乎也是次优的。乌布拉斯更快吗?有没有更有效的方法?谢谢C++ 求解线性方程组的最有效方法,c++,matrix,linear-algebra,eigen,C++,Matrix,Linear Algebra,Eigen,我有一个(nxn)对称矩阵A和一个(nx1)向量B。基本上,我只需要解x的Ax=B。问题在于,一场危机可能会是巨大的。因此,我在寻找C++中求解线性方程组的最有效算法。我浏览了艾根图书馆。显然它有一个SVD方法,但我被告知它很慢。解x=逆(A)*b似乎也是次优的。乌布拉斯更快吗?有没有更有效的方法?谢谢 编辑:矩阵A是正定的,不是稀疏的。求解形式为Ax=b的线性方程组的最佳方法是执行以下操作 将A分解为A=M1*M2格式(其中M1和M2为三角形) 使用回代法求解y的M1*y=b 使用反向替换求
编辑:矩阵A是正定的,不是稀疏的。求解形式为Ax=b的线性方程组的最佳方法是执行以下操作
- 将
分解为A
格式(其中A=M1*M2
和M1
为三角形)M2
- 使用回代法求解
的y
M1*y=b
- 使用反向替换求解
的x
M2*x=y
dpotrs
。已实现此功能的一些库如下所示:
- Netlib的lapack:and(免费)
- 英特尔的MKL:and(非商业用途免费)
- AMD的ACML:(免费)
- PLASMA:(免费,多核优化)
- MAGMA:(免费,在CUDA、OpenCL中实现)
- 库拉:(freemium,在CUDA中实现)
如果您在整个项目中使用eigen,您可以按说明连接所需的LAPACK例程。Umm。。。高斯消去法?你的矩阵是正定的吗?那么(P)CG可能是你的一个选择。除此之外,如果您的系统太大,请查看迭代方法(Gauss-Seidel、Jacobi等)而不是直接求解器。您的平均矩阵大小是多少?你的矩阵稀疏吗?从个人经验来看,稳定性比速度更重要。当快速解算器产生垃圾数时,它并没有多大意义,而现实世界中的问题往往是不稳定的。高斯吸盘,舍入误差积累严重,LU分解效果良好。你自己的旋转已经没有什么意义了,试一下所有的方法,别忘了寻找正确的结果。这对你来说应该是正确的:(也许是带有旋转稳定性的变体)。回答很好。也有特征,即C++标题只有LIB:特征::矩阵A;本征::矩阵b;/。。。加载A,b特征::矩阵x=A.fullPivLu().solve(b);fullPivLU()的A=L*U,但您可以选择大约10种不同的分解。