如何使用RCPP初始化映射的映射

how to initialize mappedsparsematrix using Rcpp

本文关键字:映射 初始化 RCPP 何使用      更新时间:2023-10-16

我想通过R中的RCPP创建一个稀疏的矩阵。如果我在这一点上错了,请纠正我。

这是我的CPP表格中的代码

// [[Rcpp::depends(RcppEigen)]]
# include <RcppEigen.h>
# include <Rcpp.h>
# include <math.h>
# include <list>
using namespace Rcpp;
using Eigen::SparseMatrix;
using Eigen::MappedSparseMatrix;
using Eigen::MatrixXd;
using Eigen::VectorXi;
typedef Eigen::VectorXd Vd;
typedef Eigen::VectorXi Vi;
typedef Eigen::MappedSparseMatrix<double> MSpMat;
typedef MSpMat::InnerIterator InIterMat;
typedef List list;
typedef Eigen::Triplet<double> T;

double euclidean_distance(double lon1, double lat1,double lon2,double lat2){
  double s = pow((lon1 - lon2),2) + pow((lat1 - lat2),2);
    double ed = sqrt(s);
    return(ed);
}

// [[Rcpp::export]]
MSpMat mymain(NumericVector lat, NumericVector lon){
   std::list<T> L;
   int length = lat.size();
   int index = 0;
   for (int i = 0; i < length - 1; i++ ){
       for (int j = i+1; j < length; j++){
         double lon1 = lon[i];
         double lon2 = lon[j];
         double lat1 = lat[i];
         double lat2 = lat[j];
         double dist = euclidean_distance(lon1,lat1,lon2,lat2);
         dist = exp(-dist/0.001);
         if (dist > 0.01 ){
            L.push_back(T(index, i, dist));
            L.push_back(T(index, j, -dist)); 
         }
      }
   }
   int nrows = L.size()/2;
   int ncols = length;
   MSpMat D(nrows, ncols);
   D.setFromTriplets(L.begin(), L.end());
   return(D);
}

但是,当我尝试在r。

no matching constructor for initialization of "MSpMat"

任何人可以帮助修复它吗?

好吧,完整错误是:

temp_eigen.cpp:51:10:错误:无匹配的构造函数来初始化'Mspmat'(又名'Mappapparsematrix') MSPMAT D(nrows,ncols); ^ ~~~~~~~~~~~~

注意:候选构造函数(隐式复制构造函数)不可行:需要1个参数,但提供了2个 类Mappapparsematrix ^

注意:候选构造函数不可行:需要6个参数,但提供了2个参数 内联映射映射Sparsematrix(索引行,索引COLS,INDEX NNZ,索引* ofterindexptr,index* inniNIndExptr,starcor* valuePtr)

从根本上讲,此处的错误正在尝试使用需要预先存在的内存位置并将其定义的数据类型(例如,两个步骤负载)。

更改:

MSpMat D(nrows, ncols);

to:

typedef Eigen::SparseMatrix< double > SpMat;
SpMat D(nrows, ncols);

产生所需的结果。

替代方法是提供一种形式:

MSpMat(Index rows, Index cols, Index nnz, 
       Index* outerIndexPtr, Index* innerIndexPtr,
       Scalar* valuePtr)