【问题标题】:Sparse matrix conversion from Matrix to armadillo with RcppArmadilloExtensions/sp_mat.h使用 RcppArmadilloExtensions/sp_mat.h 从矩阵到犰狳的稀疏矩阵转换
【发布时间】:2013-08-22 13:28:35
【问题描述】:

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

【问题讨论】:

  • 你最好在Rcpp-devel mailing list 上问这个问题,Rcpp 开发人员往往会在那里闲逛。 previous posts 的档案也可以使用。
  • 我可以重现这个。我认为spmat.h 文件需要更新。

标签: c++ r linker rcpp armadillo


【解决方案1】:

我对@9​​87654321@ 进行了一些更改以清理它。现在,aswrap 已正确模板化为来自 armadillo (arma::SpMat&lt;T&gt;) 的稀疏矩阵类型。

您可以使用 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)
*/

【讨论】:

  • 太棒了!感谢您的更正,这现在正在我的玩具示例以及我的原始项目中工作。谢谢你这么及时的回复。
猜你喜欢
  • 1970-01-01
  • 2020-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-09
相关资源
最近更新 更多