我尝试使用一个稀疏解算器作为SimplicialLLT来求对称正定矩阵的逆并返回它。
我使用Rcpp从R得到一个矩阵来连接R和cpp,我把这个矩阵作为函数cpp_sparse_solver的参数,使用sparseView()把它转换成SparseMatrix,声明求解器,用一个单位矩阵作为参数来计算和求解系统,以求逆它。但是,我得到错误“Eigen::MatrixXd is not a template”。我不是cpp方面的Maven,所以我想知道一些关于可能错误的提示。
#include <cmath>
#include <Rcpp.h>
#include <RcppEigen.h>
#include <stdio.h>
#include <R.h>
#include <Rmath.h>
#include <Eigen/Dense>
#include <Eigen/Sparse>
#include <Eigen/OrderingMethods>
#include <Eigen/SparseCholesky>
using namespace Eigen;
using namespace Rcpp;
using namespace std;
// [[Rcpp::depends(RcppEigen)]]
//' Inverts matrices inside cpp
//' @param matrix Matrix to be inverted
//' @export
// [[Rcpp::export]]
MatrixXd cpp_sparse_solver(Eigen::MatrixXd<double> matrix){
// START
// Declaring objects
int n = matrix.rows();
MatrixXd I = Matrix<double, n, n>::Identity();
matrix_s = matrix.sparseView();
SimplicialLLT<Eigen::SparseMatrix<double>, Lower, NaturalOrdering<int>> solver;
matrix_s.makeCompressed();
solver.compute(matrix_s);
MatrixXd Ainv = solver.solve(I);
return Ainv;
}
1条答案
按热度按时间rqqzpn5f1#
你的代码中有很多地方是错误的,还有一些其他的风格上的东西我会做不同的。下面是版本 *,它实际上编译 *,它的不同之处在于有
代码