在RcppArmadillo中使用Fields

时间:2014-11-18 21:17:22

标签: c++ rcpp armadillo

问候和致意,

我尝试使用字段对象类型而不是列表数据类型,以避免必须发出复制命令。我尝试这样做是为了减少与从列表中删除矩阵时相关的时间量,该矩阵由犰狳数据结构中已经定义的矩阵进行操作。 (例如,删除arma::mat * as<arma::mat>(NumericMatrix))。

具体来说,我试图将一个字段传递给一个函数并让它进行操作。我在编译时收到的错误消息是:

  

没有用于初始化&#39; arma :: field&lt;的匹配构造函数arma :: Mat&gt;&#39;

函数定义上的这个错误:#include <RcppArmadillo.h>

注意:目标是能够在函数声明中使用Field作为对象。 R不需要访问或调用此函数!主要是,该函数将作为更大的RcppArmadillo函数的辅助函数。

我尝试使用的代码是:

// [[Rcpp::depends(RcppArmadillo)]]
#include <RcppArmadillo.h>
using namespace Rcpp;

// [[Rcpp::export]]
arma::mat get_matrice_dimensions(arma::field<arma::mat> x) {

  /* Get the length of the list */
  unsigned int bin = x.n_elem;

  /* Obtain matrix size for each element */
  arma::mat storage(bin,2);
  /* Temporary storage that does not need to be created each time */
  arma::rowvec cur_elem_dims(2);
  for(unsigned int i=0; i<bin; i++){
    /* Get dimensions */
    /* NumericMatrix uses .nrow(), .ncol() vs. .n_rows, .n_cols in arma */
    cur_elem_dims(0) = x(i).n_rows; 
    cur_elem_dims(1) = x(i).n_cols;
    /* Store dimensions */
    storage.row(i) = cur_elem_dims;
  }
  /* Delete object */
  cur_elem_dims.clear();

return storage;
}

我设想将以下内容传递给函数:

x = list(matrix(0,nrow=5,ncol=3),matrix(1,nrow=5,ncol=3))
get_matrice_dimensions(x)

2 个答案:

答案 0 :(得分:1)

很容易获得对as<field<...>>的支持。我刚刚发送pull request这个Exporter实现:

template <typename T> 
class Exporter< arma::field<T> > {
public: 
    Exporter(SEXP x) : data(x){}

    inline arma::field<T> get() {
        size_t n = data.size() ;
        arma::field<T> out( n ) ;
        for(size_t i=0; i<n; i++){
            out[i] = as<T>(data[i]) ;   
        }
        return out ;
    }

private:
    List data ;
}; 

有了这个,我得到:

$ RcppScript /tmp/arma.cpp

> direct_sum(list(matrix(1:16, nc = 4), matrix(1:16,
+     nc = 4)))
     [,1] [,2]
[1,]    4    4
[2,]    4    4

答案 1 :(得分:0)

这里没有东西。你写(非常大胆)

  

R!

不需要访问或调用此函数

继续显示带有[[Rcpp::export]]标记的代码,该标记是来自R的非常定义

因此,您需要提供我之前评论的as<>()wrap()