2013-08-20 21 views
5

Próbuję użyć najnowszej możliwości pakietu RcppArmadillo (wersja 0.3.910.0 z R 3.0.1 i ewolucja wszystkiego) do konwersji rzadkiego macierz z pakietu Matrix (klasa "dgCMatrix") do typu armadillo typu sp_mat. Używam funkcji "as" i "wrap" z pliku "RcppArmadilloExtensions/spmat.h". Niestety, podczas próby utworzenia biblioteki współdzielonej napotykam błąd kompilacji .so podczas wywoływania "R CMD INSTALL myRpackage".Rzadka konwersja macierzy z macierzy na armadillo za pomocą RcppArmadilloExtensions/sp_mat.h

Oto minimalne przykład odtworzyć błąd:

  1. stworzyłem pusty pakiet z RcppArmadillo.package.skeleton()
  2. I zdefiniowanego 2 pliki .cpp z odpowiednimi nagłówkami .h do wykonywania suma a iloczyn macierzy rzadkich importowanych z R, jak następuje:

plik "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 

plik "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) ; 
} 

plik "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 

pliku "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) ; 
} 

potem, kiedy uruchomiony $ R CMD INSTALL anRpackage $, kompilator kolejno tworzy pliki ".o", ale pojawia się następujący błąd ld:

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’ 

Co więc robię źle? Przepraszam, jeśli to głupie pytanie ... W każdym razie, dzięki wszystkim facetom wykonującym tak dobrą robotę z armadilllo/RcppArmadillo i za twoją pomoc.

J.

+0

może być lepiej zadając to pytanie na [liście dyskusyjnej Rcpp-devel] (https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel), gdzie programiści Rcpp zwykle spędzają wolny czas. Dostępne są również archiwa [poprzednich postów] (http://lists.r-forge.r-project.org/pipermail/rcpp-devel/). – mtall

+0

Mogę to odtworzyć. Myślę, że plik 'spmat.h' musi zostać zaktualizowany. –

Odpowiedz

2

Zrobiłem kilka zmian do RcppArmadillo oczyścić to. Teraz as i wrap są poprawnie szablonowe dla rzadkich typów macierzy od armadillo (arma::SpMat<T>).

Czy możesz spróbować ponownie, używając RcppArmadillo z svn?

Również teraz, należy tylko trzeba

#include <RcppArmadillo.h> 

Z zaktualizowanego kodu, jestem w stanie skompilować pakiet, jak coś takiego:

#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

Świetnie! Dzięki twojej korekcie pracuje teraz nad moim zabawkowym przykładem, jak również nad moim oryginalnym projektem. Dziękuję za tak szybką odpowiedź. – user2699855