2017-07-10 2 views
0

Depuis la version 3.3.3.0 de RcppEigen, le MappedSpareMatrixT a été deprecated. Pour une raison quelconque, lors de la compilation de fonctions avec ce nouveau type, j'obtiens des erreurs.Nouvelles erreurs de compilation RcppEigen de type SparseMatrix mappées

Par exemple (basé sur this question);

EDIT: avec des suggestions de sans manteau - toujours les mêmes erreurs.

#include <RcppEigen.h> 

typedef Eigen::Map<Eigen::SparseMatrix<double> > mappedSparseMatrix; 
typedef Eigen::Map<Eigen::VectorXd> mappedVector; 

// [[Rcpp::depends(RcppEigen)]] 
// [[Rcpp::export]] 
Eigen::VectorXd cgSparse(const mappedSparseMatrix A, const mappedVector b) { 
    Eigen::ConjugateGradient< mappedSparseMatrix, Eigen::Lower > cg(A); 
    return cg.solve(b); 
} 

J'ai essayé différentes choses, même copié le type de la Rcppeigen unitTests;

typedef Eigen::Map<Eigen::SparseMatrix<double, Eigen::ColMajor> > MapMat; 

Dans les deux cas, j'obtiens les erreurs suivantes;

errors

SessionInfo() ici:

R version 3.4.0 (2017-04-21) 
Platform: x86_64-w64-mingw32/x64 (64-bit) 
Running under: Windows >= 8 x64 (build 9200) 

Matrix products: default 

locale: 
[1] LC_COLLATE=English_United States.1252 LC_CTYPE=English_United States.1252 
[3] LC_MONETARY=English_United States.1252 LC_NUMERIC=C       
[5] LC_TIME=English_United States.1252  

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base  

other attached packages: 
[1] RcppEigen_0.3.3.3.0 RevoUtilsMath_10.0.0 

loaded via a namespace (and not attached): 
[1] compiler_3.4.0 Matrix_1.2-9  RevoUtils_10.0.4 tools_3.4.0  Rcpp_0.12.10  grid_3.4.0  
[7] lattice_0.20-35 

Avec les changements mentionnés - comment puis-je mapper mes matrices creuses? Par exemple, dans la fonction ci-dessus sparseCG? (NB: je suis débutant en C++)

Répondre

0

Il y a une note dans les fichiers RcppEigenForward.h et RcppEigenWrap.h que le mappedSparseMatrix a été déprécié en amont en commençant par Eigen 3.3.0.

Si je change à

typedef Eigen::SparseMatrix<double> mappedSparseMatrix; 

-à-dire utiliser une matrice pure et simple clairsemée (par opposition à une carte pour elle), il compile.

+1

'MappedSparseMatrix ' -> 'Mappe ' classe – coatless

+0

Oui, c'est vrai. Cependant, j'avais l'impression que la cartographie était plus efficace sur le plan de la mémoire (c.-à-d. [Elle cartographie plutôt que des copies] (https://github.com/RcppCore/rcpp-gallery/blob/gh-pages/src/2013-01-11- eigen-eigenvalues.cpp # L22)). Mes ensembles de données peuvent devenir très volumineux - par conséquent, je pensais qu'il était préférable d'éviter de créer une copie à chaque fois. En plus de cela, pas sûr que cela signifie que c'est déprécié en amont? Donc, il sera progressivement éliminé à l'avenir? – tstev

+0

Toutes les questions pour l'amont. Ce n'était pas notre décision. –