我在R中处理一个大的稀疏矩阵(10k x 10k方差/协方差矩阵,所以对称和正定)。我需要一种快速的方法来找到该矩阵的Cholesky分解。我知道使用RcppEigen包中的SparseLU可以解决方案,但我无法弄清楚它是如何工作的。
在下一个脚本中,我将函数的示例放在R中。它加载了一个SparseMatrix SS,我需要对其进行Cholesky分解。我希望得到与chol(SS)相同的输出,具有典型的R函数chol。
cholScript<-'using Eigen::Map;
using Eigen::SparseMatrix;
const SparseMatrix<double> Sigma(as<SparseMatrix<double> >(Sigma));
using namespace Rcpp;
// compute C, the Cholesky decomposition of Sigma
return wrap(C);'
cxxfunction(signature(Sigma = "dgCMatrix"), cholScript, plugin = "RcppEigen")
非常感谢。
答案 0 :(得分:1)
我认为这可以解决问题:
CholeskyCppSparse<-'using Eigen::Map;
using Eigen::SparseMatrix;
using Eigen::LLT;
const SparseMatrix<double> SS(as<SparseMatrix<double> >(Sigma));
typedef Eigen::SimplicialLLT<SparseMatrix<double> > SpChol;
const SpChol Ch(SS);
return wrap(Ch.matrixL());'
CholSparse <- cxxfunction(signature(Sigma = "dgCMatrix"), CholeskyCppSparse, plugin = "RcppEigen")
如果想要分解的上三角形部分,则更改矩阵的矩阵L(与R中的chol()函数一样。)