6 votes

Conversion des matrices spares de Matrix en armadillo avec RcppArmadilloExtensions/sp_mat.h

J'essaie d'utiliser les capacités très récentes du paquet RcppArmadillo (version 0.3.910.0 avec R 3.0.1 et tout ce qui est à jour) pour convertir une matrice éparse du paquet Matrix (classe "dgCMatrix") au type sp_mat d'armadillo. J'utilise les fonctions "as" et "wrap" du fichier "RcppArmadilloExtensions/spmat.h". Malheureusement, je rencontre une erreur de compilation lorsque j'essaie de créer la bibliothèque partagée .so en invoquant "R CMD INSTALL myRpackage".

Voici un exemple minimal pour reproduire l'erreur :

  1. J'ai créé un paquet vide avec RcppArmadillo.package.skeleton()
  2. J'ai défini 2 fichiers .cpp avec leurs en-têtes .h correspondants pour effectuer la somme et le produit de matrices éparses importées de R, comme suit :

file "arma_sp_sum.h"

#ifndef _anRpackage_ARMA_SP_SUM_H
#define _anRpackage_ARMA_SP_SUM_H

#include <RcppArmadilloExtensions/spmat.h>

RcppExport SEXP arma_sp_prod(SEXP SPMAT) ;

#endif

Fichier "arma_sp_sum.cpp".

#include "arma_sp_sum.h"
using namespace Rcpp ;

SEXP arma_sp_sum(SEXP SPMAT){

  arma::sp_mat m1 = Rcpp::as<arma::sp_mat>(SPMAT) ;
  arma::sp_mat m2 = Rcpp::as<arma::sp_mat>(SPMAT) ;

  arma::sp_mat res = m1 + m2;
  return Rcpp::wrap(res) ;
}

Fichier "arma_sp_prod.h".

#ifndef _anRpackage_ARMA_SP_PROD_H
#define _anRpackage_ARMA_SP_PROD_H

#include <RcppArmadilloExtensions/spmat.h>

RcppExport SEXP arma_sp_prod(SEXP SPMAT) ;

#endif

Fichier "arma_sp_prod.cpp".

#include "arma_sp_prod.h"

using namespace Rcpp ;

SEXP arma_sp_prod(SEXP SPMAT){

  arma::sp_mat m1 = Rcpp::as<arma::sp_mat>(SPMAT) ;
  arma::sp_mat m2 = Rcpp::as<arma::sp_mat>(SPMAT) ;

  arma::sp_mat res = m1 * m2;
  return Rcpp::wrap(res) ;
}

Ensuite, en exécutant $ R CMD INSTALL anRpackage $, le compilateur crée successivement les fichiers ".o" mais j'obtiens l'erreur ld suivante :

ld: duplicate symbol arma::SpMat<double> Rcpp::as<arma::SpMat<double> >(SEXPREC*)in arma_sp_sum.o and arma_sp_prod.o for architecture x86_64
collect2: ld returned 1 exit status
make: *** [anRpackage.so] Error 1
ERROR: compilation failed for package ‘anRpackage’

Alors, qu'est-ce que je fais de mal ? Désolé si c'est une question stupide... En tout cas, merci à tous les gars qui font un si bon travail avec armadilllo/RcppArmadillo, et pour votre aide.

J.

2voto

Romain Francois Points 8223

J'ai apporté quelques modifications à RcppArmadillo pour nettoyer ça. Maintenant as y wrap sont correctement modélisés pour les types de matrices éparses à partir de armadillo ( arma::SpMat<T> ).

Pouvez-vous réessayer en utilisant le RcppArmadillo à partir de svn ?

Aussi, maintenant, vous devriez seulement avoir besoin

#include <RcppArmadillo.h>

Avec le code mis à jour, je suis capable de compiler votre paquet ainsi que quelque chose comme ceci :

#include <RcppArmadillo.h>
// [[Rcpp::depends("RcppArmadillo")]]
using namespace Rcpp ;

// [[Rcpp::export]]
arma::sp_mat sparse( arma::sp_mat A ){
    A(0,0) = 1;
    A(1,0) = 2;
    return A ;
}

/*** R  
    require(Matrix)
    m <- Matrix(c(0,0,2:0), 3,5)
    sparse(m)
*/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X