Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 求解线性方程组的最有效方法_C++_Matrix_Linear Algebra_Eigen - Fatal编程技术网

C++ 求解线性方程组的最有效方法

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 使用反向替换求

我有一个(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
  • 使用反向替换求解
    x
    M2*x=y
对于方阵,步骤1将使用

对于非方矩阵,步骤1将使用

如果矩阵A是正定的,而不是稀疏的,那么第一步就使用它

如果你想使用eigen,你必须先使用它,然后再使用它

如果这仍然很慢,谢天谢地,有许多线性代数库可以帮助提高性能。您应该查找的例程是
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种不同的分解。