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:
- stworzyłem pusty pakiet z RcppArmadillo.package.skeleton()
- 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.
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
Mogę to odtworzyć. Myślę, że plik 'spmat.h' musi zostać zaktualizowany. –