当A = LLt时,求解Lx = b和Px = b

时间:2018-03-21 17:17:57

标签: c++ sparse-matrix linear-algebra eigen matrix-decomposition

我正在使用Eigen分解稀疏SPD矩阵A.它将是LLt或LDLt分解(Cholesky),因此我们可以假设矩阵将被分解为A = P-1 LDLt P,其中P是置换矩阵,L是三角形下部和D对角线(可能是同一性)。如果我做

SolverClassName<SparseMatrix<double> > solver;
solver.compute(A);

要解决Lx=b,那么执行以下操作是否有效?

solver.matrixL().TriangularView<Lower>().solve(b)

同样,要解决Px=b,那么执行以下操作是否有效?

solver.permutationPinv()*b

我想这样做是为了有效而稳定地计算bt A-1 b

1 个答案:

答案 0 :(得分:0)

了解_solve_impl如何实施SimplicialCholesky。基本上,你可以简单地写:

Eigen::VectorXd x = solver.permutationP()*b; // P not Pinv!
solver.matrixL().solveInPlace(x); // matrixL is already a triangularView

// depending on LLt or LDLt use either:
double res_llt = x.squaredNorm();
double res_ldlt = x.dot(solver.vectorD().asDiagonal().inverse()*x);

请注意,您需要乘以P而不是Pinv,因为相反 A = P^-1 L D L^t P

P^-1 L^-t D^-1 L^-1 P

因为当采用产品的反转时,矩阵的顺序会反转。