MappedSparseMatrix en RcppEigen
Quiero usar el algoritmo de gradiente conjugado implementado en el paquete RcppEigen para resolver matrices dispersas grandes.
Como soy nuevo en Rcpp y C ++, acabo de comenzar con las matrices densas.
// [[Rcpp::depends(RcppEigen)]]
#include <Rcpp.h>
#include <RcppEigen.h>
#include <Eigen/IterativeLinearSolvers>
using Eigen::SparseMatrix;
using Eigen::MappedSparseMatrix;
using Eigen::Map;
using Eigen::MatrixXd;
using Eigen::VectorXd;
using Rcpp::as;
using Eigen::ConjugateGradient;
typedef Eigen::MappedSparseMatrix<double> MSpMat;
// [[Rcpp::export]]
VectorXd getEigenValues(SEXP As, SEXP bs) {
const Map<MatrixXd> A(as<Map<MatrixXd> > (As));
const Map<VectorXd> b(as<Map<VectorXd> > (bs));
ConjugateGradient<MatrixXd> cg;
cg.compute(A);
VectorXd x=cg.solve(b);
return x;
}
Esto funciona como se esperaba. Por lo tanto, pensé extender esto para adaptarlo a matrices dispersas.
// [[Rcpp::depends(RcppEigen)]]
#include <Rcpp.h>
#include <RcppEigen.h>
#include <Eigen/IterativeLinearSolvers>
using Eigen::SparseMatrix;
using Eigen::MappedSparseMatrix;
using Eigen::Map;
using Eigen::MatrixXd;
using Eigen::VectorXd;
using Rcpp::as;
using Eigen::ConjugateGradient;
typedef Eigen::MappedSparseMatrix<double> MSpMat;
// [[Rcpp::export]]
VectorXd getEigenValues(SEXP As, SEXP bs) {
const MSpMat A = as<MSpMat>(As);
const Map<VectorXd> b(as<Map<VectorXd> > (bs));
ConjugateGradient<SparseMatrix<double> > cg;
cg.compute(A);
VectorXd x=cg.solve(b);
return x;
}
Sin embargo, esto tiende a dar resultados realmente extraños. El código en sí mismo tampoco está dando ningún error. Espero que alguien pueda ayudarme a corregir este error.
Gracias.