sparse-matrix - 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
解决方案
推荐阅读
- php - 如何创建 DATA 数组并使用 POST 方法传递给 API
- mongodb - 从对象数组 MONGODB 添加值
- java - 通过 Project Reactor 同时完成所有任务,但不再有 K 个任务
- reactjs - JavaScript 将 CSV 转换为 PDF
- python - 遍历多维 numpy 数组并从一维数组中选择值
- c# - 使用 EF Core 2.0 过滤记录时出现 Where 子句转换错误
- android - 使用 DownloadManager 以编程方式下载 Apk 文件后无法打开
- mathematical-optimization - 分支定界 VRP 具有零节点
- burp - Burp Suite 虽然我的配置是正确的,但 Chrome 仍然不允许我访问 HTTPS 站点并抛出错误
- python - 名称错误:名称???未定义 - 输入 python 3.7.6