Matrix 特征:稀疏v传统矩阵

Matrix 特征:稀疏v传统矩阵,matrix,sparse-matrix,eigen,Matrix,Sparse Matrix,Eigen,为了加快计算速度,我第一次尝试使用稀疏矩阵。我有一个现有的,传统的矩阵工作,Ax=b。我想用一个稀疏矩阵,AA*sparse\ux=b。若要查看是否一切正常,请将x与稀疏x进行比较,它们应该是相同的…但它们不是…我如何使用稀疏矩阵并获得与传统矩阵相同的答案 Eigen::MatrixXd A(1000,1000); //Fill A Eigen::VectorXd b(1000); //Fill b Eigen::VectorXd x(1000); x = A.colPivHouseh

为了加快计算速度,我第一次尝试使用稀疏矩阵。我有一个现有的,传统的矩阵工作,Ax=b。我想用一个稀疏矩阵,AA*sparse\ux=b。若要查看是否一切正常,请将x与稀疏x进行比较,它们应该是相同的…但它们不是…我如何使用稀疏矩阵并获得与传统矩阵相同的答案

Eigen::MatrixXd A(1000,1000);

//Fill A

Eigen::VectorXd b(1000);

//Fill b

Eigen::VectorXd x(1000);

x = A.colPivHouseholderQr().solve(b);

    

//Sparcity is 98% for matrix A…How do I do use sparse matrix to speed things up?

//I am following: https://eigen.tuxfamily.org/dox-devel/group__TutorialSparse.html

std::vector<Eigen::Triplet<double>> coefficients;

for(auto i = 0; i < A.rows(); ++i) {

    for(auto j = 0; j < Acols(); ++j) {

        const auto ij_val{ A(i, j) };

        if(!CApproximately::equal(ij_val, 0.0)) {

            Eigen::Triplet<double> trip(i, j, ij_val);

            coefficients.push_back(trip);

        }

    }

}

//Unknows

auto m = b_.rows();

Eigen::SparseMatrix<double> A(m, m);

A.setFromTriplets(coefficients.begin(), coefficients.end());

Eigen::SimplicialCholesky<Eigen::SparseMatrix<double>> chol(A);

Eigen::VectorXd sparse_x = chol.solve(b);
Eigen::MatrixXd A(10001000);
//填补
本征::矢量xd b(1000);
//填充b
本征::矢量xd x(1000);
x=A.colPivHouseholderQr().solve(b);
    
//矩阵A的稀疏度为98%。。我如何使用稀疏矩阵来加快速度?
//我的发言如下:https://eigen.tuxfamily.org/dox-devel/group__TutorialSparse.html
std::向量系数;
对于(自动i=0;i
确保您得到了一个解决方案,
chol.info()==Success
,检查解决方案的质量
(稀疏a*稀疏x-b).norm()/b.norm()
,该解决方案应小于1e-14。如果是这样的话,那么你得到了一个解决方案,也许你的问题承认有多个解决方案,或者你没有解决同一个系统。要检查这一点,您还可以打印
(密集A*稀疏x-b).norm()/b.norm()
。首先,您可以使用。另外,您确定
A
是对称的吗?你在稠密情况下使用了QR分解。好的,我来看看sparseview,谢谢。A是绝对对称的。我有QR是因为我在旋转不同的解算器进行速度测试…我会把一个正确的放回…在eigen的深处,我根据你们所有的评论找到它。Diag(k,k)=0。我的矩阵中的零索引是未使用的(正如我从其他地方的Fortran作者那里学到的),并且零,因此chol没有成功。现在,传统的v稀疏解决方案相匹配。非常感谢。