使用RcppArmadilloExtensions / sp_mat.h从Matrix到犰狳的稀疏矩阵转换

时间:2013-08-20 13:13:15

标签: c++ r linker rcpp armadillo

我正在尝试使用RcppArmadillo软件包的最新功能(版本0.3.910.0,R 3.0.1和evrerything为最新版本)将稀疏矩阵从Matrix软件包(类“dgCMatrix”)转换为sp_mat类型的犰狳。我正在使用文件“RcppArmadilloExtensions / spmat.h”中的“as”和“wrap”函数。不幸的是,我在尝试创建共享库时遇到编译错误.so在调用“R CMD INSTALL myRpackage”时。

以下是重现错误的最小示例:

  1. 我用RcppArmadillo.package.skeleton()
  2. 创建了一个空包
  3. 我使用相应的头文件.h定义了2个.cpp文件,以执行从R导入的稀疏矩阵的和和乘积,如下所示:
  4. 文件“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’
    

    那么我做错了什么?对不起,如果这是一个愚蠢的问题......无论如何,感谢所有在armadilllo / RcppArmadillo做得很好的人,以及你的帮助。

    学家

1 个答案:

答案 0 :(得分:2)

我对RcppArmadillo进行了一些更改以清理它。现在aswrap正确模板化armadilloarma::SpMat<T>)的稀疏矩阵类型。

您可以使用svn中的RcppArmadillo再试一次吗?

此外,现在,你应该只需要

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