2016-11-28 11 views
1

RでRcpp経由でmappedsparsematrix型を使用してスパース行列を作成したいと思います。スパース行列ではなくmappedsparsematrixを選択します。この点について私が間違っているなら、私を訂正してください。ここでRcppを使用してmappedsparsematrixを初期化する方法

は私のコードは、私はR.

no matching constructor for initialization of "MSpMat" 

をCPPファイルをソースしようとすると、しかし、それはこのエラーを返すの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); 
} 

で誰もがそれを修正するのに役立つことはできますか?

答えて

3

さて、完全な誤りがある:

基本的に

temp_eigen.cpp:51:10: error: no matching constructor for initialization of 'MSpMat' (aka 'MappedSparseMatrix') MSpMat D(nrows, ncols); ^~~~~~~~~~~~~

note: candidate constructor (the implicit copy constructor) not viable: requires 1 argument, but 2 were provided class MappedSparseMatrix ^

note: candidate constructor not viable: requires 6 arguments, but 2 were provided inline MappedSparseMatrix(Index rows, Index cols, Index nnz, Index* outerIndexPtr, Index* innerIndexPtr, Scalar* valuePtr)

、ここでエラーが例えば2(既存のメモリ位置を必要とするデータの種類を使用しようとそうでないかのように定義されますステップロード)。

変更:

MSpMat D(nrows, ncols); 

に:

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

は、所望の結果が得られます。

非常にうまく行って
MSpMat(Index rows, Index cols, Index nnz, 
     Index* outerIndexPtr, Index* innerIndexPtr, 
     Scalar* valuePtr) 
+0

代替は次の形式を提供することです。 –

関連する問題