c++ 使用特征值求稀疏矩阵的逆

6fe3ivhb  于 2022-11-27  发布在  其他
关注(0)|答案(1)|浏览(263)

我尝试使用一个稀疏解算器作为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;
}
rqqzpn5f

rqqzpn5f1#

你的代码中有很多地方是错误的,还有一些其他的风格上的东西我会做不同的。下面是版本 *,它实际上编译 *,它的不同之处在于有

  • 我把头文件的数量减少到了你需要的一个
  • 删除了大多数引起麻烦的名称空间扁平化语句
  • 更新了一些类型
代码
#include <RcppEigen.h>

// [[Rcpp::depends(RcppEigen)]]
//' Inverts matrices inside cpp
//' @param matrix Matrix to be inverted
//' @export
// [[Rcpp::export]]
Eigen::MatrixXd cpp_sparse_solver(Eigen::MatrixXd matrix){
    int n = matrix.rows();
    Eigen::MatrixXd I = Eigen::MatrixXd::Identity(n,n);
    Eigen::SparseMatrix<double> matrix_s = matrix.sparseView();
    Eigen::SimplicialLLT<Eigen::SparseMatrix<double>, Eigen::Lower, 
                         Eigen::NaturalOrdering<int>> solver;
    matrix_s.makeCompressed();
    solver.compute(matrix_s);
    Eigen::MatrixXd Ainv = solver.solve(I);
    return Ainv;
}

相关问题