我正在使用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
。
答案 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
因为当采用产品的反转时,矩阵的顺序会反转。