首页 > 解决方案 > Eigen SparseQR 给出的结果与其他结果不同:bdcSVD、共轭梯度

问题描述

我尝试使用特征求解器(特征 3.3.7)求解线性系统 Ax = b。但是,我发现 SparseQR 求解的结果 (x) 与密集求解器 (bdcsvd) 和其他稀疏求解器的结果不同,但相对误差 (||Ax - b|| / ||b||) 是相同的。

有人可以帮助我理解为什么 sparseQR 会给出不同的结果,以及如何确保它给出与 SVD 相同的结果吗?

我还注意到,对于其他一些数据集,sparseQR 和 SVD 给出了相同的结果,但不是来自 CG。

谢谢你。

矩阵 A 和 b 可以在下面找到。

Eigen::MatrixXd A; // reading from a file, see below for a simple sample
Eigen::MatrixXd b; // reading from a file

Eigen::VectorXd x_svd = A.bdcSvd(Eigen::ComputeThinU | Eigen::ComputeThinV).solve(b);

//convert to sparse matrix
Eigen::SparseMatrix<double> As = A.sparseView(0.1, 1e-5);

tau = 1e-3; // check coefficients are close or not

// SparseQR
{
Eigen::SparseQR<Eigen::SparseMatrix<double>, Eigen::COLAMDOrdering<int>> solver;
//solver.setPivotThreshold(1e-10);
solver.compute(As);
if (solver.info() != Eigen::Success)
    std::cout << "SparseQR::Decomposition Failed" << std::endl; 
Eigen::VectorXd xs = solver.solve(b);

if (solver.info() != Eigen::Success)
    std::cout << "SparseQR::Solving Failed" << std::endl;
std::string str_equal = xs.isApprox(x_svd, tau) ? " Equal" : " UnEqual";
std::cout << "Results::" << str_equal << std::endl;
std::cout << "EstimatedError: " << (As * xs - b).norm() / b.norm() << std::endl;
}

// ConjugateGradient
{
Eigen::ConjugateGradient<Eigen::SparseMatrix<double> > solver(As.transpose() * As);
if (solver.info() != Eigen::Success)
    std::cout << "CG::Decomposition Failed" << std::endl;
Eigen::VectorXd xcg = solver.solve(As.transpose() * b);
if (solver.info() != Eigen::Success)
    std::cout << "CG::Solving Failed" << std::endl;

std::cout << "#Iterations: " << solver.iterations() << std::endl;
std::cout << "EstimatedError: " << solver.error() << std::endl;
std::string str_equal = corr.isApprox(para_coeff, tau) ? " Equal" : " UnEqual";
std::cout << "Results::" << str_equal << std::endl;
}

矩阵 A:


     0  35516      0  17732 -35516      0 -17732      0      0      0      0      0      0      0      0      0      0      0      0      0      0      0      0      0
     0  17732      0  35516 -17732      0 -35516      0      0      0      0      0      0      0      0      0      0      0      0      0      0      0      0      0
     0 -35516      0 -17732  35516      0  17732      0      0      0      0      0      0      0      0      0      0      0      0      0      0      0      0      0
     0 -17732      0 -35516  17732      0  35516      0      0      0      0      0      0      0      0      0      0      0      0      0      0      0      0      0
     0      0      0      0      0  35516      0  17732 -35516      0 -17732      0      0      0      0      0      0      0      0      0      0      0      0      0
     0      0      0      0      0  17732      0  35516 -17732      0 -35516      0      0      0      0      0      0      0      0      0      0      0      0      0
     0      0      0      0      0 -35516      0 -17732  35516      0  17732      0      0      0      0      0      0      0      0      0      0      0      0      0
     0      0      0      0      0 -17732      0 -35516  17732      0  35516      0      0      0      0      0      0      0      0      0      0      0      0      0
     0      0      0      0      0      0      0      0      0      0      0      0      0  35516      0  17732 -35516      0 -17732      0      0      0      0      0
     0      0      0      0      0      0      0      0      0      0      0      0      0  17732      0  35516 -17732      0 -35516      0      0      0      0      0
     0      0      0      0      0      0      0      0      0      0      0      0      0 -35516      0 -17732  35516      0  17732      0      0      0      0      0
     0      0      0      0      0      0      0      0      0      0      0      0      0 -17732      0 -35516  17732      0  35516      0      0      0      0      0
     0      0      0      0      0      0      0      0      0      0      0      0      0      0      0      0      0  35516      0  17732 -35516      0 -17732      0
     0      0      0      0      0      0      0      0      0      0      0      0      0      0      0      0      0  17732      0  35516 -17732      0 -35516      0
     0      0      0      0      0      0      0      0      0      0      0      0      0      0      0      0      0 -35516      0 -17732  35516      0  17732      0
     0      0      0      0      0      0      0      0      0      0      0      0      0      0      0      0      0 -17732      0 -35516  17732      0  35516      0
     0      0  35516  17732      0      0      0      0      0      0      0      0 -35516 -17732      0      0      0      0      0      0      0      0      0      0
     0      0  17732  35516      0      0      0      0      0      0      0      0 -17732 -35516      0      0      0      0      0      0      0      0      0      0
     0      0 -35516 -17732      0      0      0      0      0      0      0      0  35516  17732      0      0      0      0      0      0      0      0      0      0
     0      0 -17732 -35516      0      0      0      0      0      0      0      0  17732  35516      0      0      0      0      0      0      0      0      0      0
     0      0      0      0      0      0  35516  17732      0      0      0      0      0      0      0      0 -35516 -17732      0      0      0      0      0      0
     0      0      0      0      0      0  17732  35516      0      0      0      0      0      0      0      0 -17732 -35516      0      0      0      0      0      0
     0      0      0      0      0      0 -35516 -17732      0      0      0      0      0      0      0      0  35516  17732      0      0      0      0      0      0
     0      0      0      0      0      0 -17732 -35516      0      0      0      0      0      0      0      0  17732  35516      0      0      0      0      0      0
     0      0      0      0      0      0      0      0      0      0  35516  17732      0      0      0      0      0      0      0      0 -35516 -17732      0      0
     0      0      0      0      0      0      0      0      0      0  17732  35516      0      0      0      0      0      0      0      0 -17732 -35516      0      0
     0      0      0      0      0      0      0      0      0      0 -35516 -17732      0      0      0      0      0      0      0      0  35516  17732      0      0
     0      0      0      0      0      0      0      0      0      0 -17732 -35516      0      0      0      0      0      0      0      0  17732  35516      0      0


b

      225915
     -380755
     -225915
      380755
 1.68807e+07
 9.48266e+06
-1.68807e+07
-9.48266e+06
    -32610.3
 -1.5961e+06
     32610.3
  1.5961e+06
-1.08558e+07
 1.41591e+06
 1.08558e+07
-1.41591e+06
-2.79489e+06
-4.57751e+06
 2.79489e+06
 4.57751e+06
 1.22018e+06
 3.70838e+06
-1.22018e+06
-3.70838e+06
-4.80155e+06
-2.53063e+06
 4.80155e+06
 2.53063e+06

标签: sparse-matrixeigeneigen3

解决方案


推荐阅读