2013-08-20 14 views
5

Bir seyrek dönüşüm için RcppArmadillo paketinin (R 3.0.1 sürüm 0.3.910.0 ve evrerything) en son yeteneğini kullanmaya çalışıyorum Matrix paketinden (class "dgCMatrix") matrisin sp_mat türü armadillo'ya. "RcppArmadilloExtensions/spmat.h" dosyasındaki "as" ve "wrap" işlevlerini kullanıyorum. Ne yazık ki, "R CMD INSTALL myRpackage" çağrılırken paylaşılan kütüphaneyi oluşturmaya çalışırken bir derleme hatası yaşıyorum. RcppArmadilloExtensions/sp_mat.h ile Matrix'den armadillo'ya dönüşümlü matris dönüşümü

  1. I gerçekleştirmek için .H karşılık gelen başlıklarıyla 2 cpp dosyaları tarif
  2. RcppArmadillo.package.skeleton() ile, bir boş paket oluşturuldu: Burada

    hata yeniden oluşturmak için en az bir örnektir toplam ve R ithal seyrek matrisler ürün, aşağıdaki gibi:

    #ifndef _anRpackage_ARMA_SP_SUM_H 
    #define _anRpackage_ARMA_SP_SUM_H 
    
    #include <RcppArmadilloExtensions/spmat.h> 
    
    RcppExport SEXP arma_sp_prod(SEXP SPMAT) ; 
    
    #endif 
    
    "arma_sp_sum.h"

dosya

dosyası "arma_sp_sum.cpp"

#ifndef _anRpackage_ARMA_SP_PROD_H 
#define _anRpackage_ARMA_SP_PROD_H 

#include <RcppArmadilloExtensions/spmat.h> 

RcppExport SEXP arma_sp_prod(SEXP SPMAT) ; 

#endif 

dosyası "arma_sp_prod.cpp" O

#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) ; 
} 

"arma_sp_prod.h"

#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) ; 
} 

dosya, zaman $ R CMD KUR çalışıyor anRpackage $, derleyici art arda ".o" dosyaları oluşturur ama aşağıdaki ld hatası alırsınız:

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’ 

Peki ne yapıyorum yanlış? Maalesef aptalca bir soru olsaydı ... Neyse, armadilllo/RcppArmadillo ile iyi bir iş yapan herkese ve yardımın için teşekkürler.

J.

+0

: güncellenen kod ile

Ayrıca, şimdi, sadece gerektiğinde

#include <RcppArmadillo.h> 

, böyle bir şey yanı sıra paket derlemek açabiliyorum Bu soruyu, Rcpp geliştiricilerinin takılmaya eğilimli olduğu [Rcpp-devel postalama listesi] (https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel) adresinden sormak. [Önceki yazılar] (http://lists.r-forge.r-project.org/pipermail/rcpp-devel/) arşivleri de mevcuttur. – mtall

+0

Bunu yeniden üretebilirim. Ben spmat.h' dosyasının güncellenmesi gerektiğini düşünüyorum. –

cevap

2

Bunu temizlemek için RcppArmadillo birkaç değişiklik yaptık. Artık as ve wrap, armadillo (arma::SpMat<T>) 'dan seyrek matris türleri için doğru şekilde şablonlandırılmıştır.

Tekrar svn'den RcppArmadillo'u kullanarak yeniden deneyebilir misiniz? Sen daha iyi durumda olabilir

#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) 
*/ 
+0

Harika! Düzeltme sayesinde, bu benim orjinal projemde olduğu gibi oyuncak örneğim üzerinde çalışıyor. Böyle bir cevap için teşekkür ederim. – user2699855