Преобразование разреженной матрицы из Matrix в броненосец с помощью RcppArmadilloExtensions/sp_mat.h

Я пытаюсь использовать самую последнюю возможность пакета RcppArmadillo (версия 0.3.910.0 с R 3.0.1 и все в актуальном состоянии) для преобразования разреженной матрицы из пакета Matrix (класс "dgCMatrix") в тип sp_mat броненосец. Я использую функции "as" и "wrap" из файла "RcppArmadilloExtensions/spmat.h". К сожалению, у меня возникает ошибка компиляции при попытке создать разделяемую библиотеку .so при вызове «R CMD INSTALL myRpackage».

Вот минимальный пример для воспроизведения ошибки:

  1. Я создал пустой пакет с помощью RcppArmadillo.package.skeleton().
  2. Я определил 2 файла .cpp с соответствующими заголовками .h для выполнения суммы и произведения разреженных матриц, импортированных из R, следующим образом:

файл "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

файл "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) ;
}

файл "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

файл "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) ;
}

Затем при запуске $ R CMD INSTALL anRpackage $ компилятор последовательно создает файлы «.o», но я получаю следующую ошибку 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’

Так что я делаю неправильно? Извините, если это глупый вопрос... В любом случае, спасибо всем ребятам, проделавшим такую ​​хорошую работу с броненосцем/RcppArmadillo, и за вашу помощь.

J.


person Julien Chiquet    schedule 20.08.2013    source источник
comment
Возможно, вам лучше задать этот вопрос на Список рассылки Rcpp-devel, где обычно общаются разработчики Rcpp. Также доступны архивы предыдущих сообщений.   -  person mtall    schedule 20.08.2013
comment
Я могу воспроизвести это. Я думаю, что файл spmat.h нужно обновить.   -  person Romain Francois    schedule 20.08.2013


Ответы (1)


Я внес несколько изменений в RcppArmadillo, чтобы очистить это. Теперь as и wrap правильно шаблонируются для типов разреженных матриц из armadillo (arma::SpMat<T>).

Можете ли вы попробовать еще раз, используя RcppArmadillo из svn?

Кроме того, теперь вам нужно только

#include <RcppArmadillo.h>

С обновленным кодом я могу скомпилировать ваш пакет, а также что-то вроде этого:

#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)
*/
person Romain Francois    schedule 20.08.2013
comment
Большой ! Благодаря вашему исправлению, теперь это работает как с моим игрушечным примером, так и с моим оригинальным проектом. Спасибо за такой быстрый ответ. - person Julien Chiquet; 20.08.2013