C++ 特征SparseQR矩阵逆不像Matlab中那样精确

C++ 特征SparseQR矩阵逆不像Matlab中那样精确,c++,matlab,sparse-matrix,eigen3,qr-decomposition,C++,Matlab,Sparse Matrix,Eigen3,Qr Decomposition,在我的算法中,我采用了稀疏矩阵逆运算,并通过使用QR分解方法的a*x=b方法来解决它。在Matlab上,QR操作运行良好 但是,当我试图用EGIN库将代码转换成C++时,我没有得到相同的答案。 在某些情况下,与Matlab中的结果相比,向量x的每个元素上都有一些值的偏移。但是,导致偏移的该值在向量中的所有元素中都是恒定的 我所做的一瞥: Eigen::SparseMatrix<float> A(m, n); Eigen::VectorXf b; Eigen::SparseQR<

在我的算法中,我采用了稀疏矩阵逆运算,并通过使用QR分解方法的a*x=b方法来解决它。在Matlab上,QR操作运行良好

<>但是,当我试图用EGIN库将代码转换成C++时,我没有得到相同的答案。 在某些情况下,与Matlab中的结果相比,向量x的每个元素上都有一些值的偏移。但是,导致偏移的该值在向量中的所有元素中都是恒定的

我所做的一瞥:

Eigen::SparseMatrix<float> A(m, n);
Eigen::VectorXf b;
Eigen::SparseQR<Eigen::SparseMatrix<float>, Eigen::COLAMDOrdering<int>> solver; 
solver.compute(A);
Eigen::VectorXf x = solver.solve(b);
x是我的最后一个向量,它包含了A的结果

另外,我尝试将它作为一个完整的矩阵来求解,但与Matlab相比,C++仍然产生了不同的答案。 这里有人面临过类似的问题吗?如果是,欢迎提供任何帮助或指点。 另一方面,如果我的理解有问题,我们也非常感谢您的纠正


谢谢。

如果需要精度,请使用double not float,您可以通过打印剩余A*x-b.norm/b.norm来检查返回溶液的精度。如果它足够小,那么你就得到了一个解决方案。请注意,如果问题不是满秩,则问题的解决方案不是唯一的。您好,谢谢您的提示。没有设置枢轴阈值,它不是一个满秩,但我手动设置了一个低阈值,现在我得到了一个满秩矩阵。但同样,我希望使用float在前2-3个小数位上有一定程度的准确性。所以你说我需要加倍才能得到完美的精确度?因为我试过了,结果不一样,不准确。使用double时A*x-b.norm/b.norm的值是多少?嗨,很抱歉我忘了更新!我用float本身计算了剩余误差,得到了期望的结果。我使用这个值作为旋转阈值,得到了满秩,然后得到了期望的结果。非常感谢你的指点。