Rcpp Armadillo中的示例

时间:2019-03-01 20:24:34

标签: r rcpp armadillo

我目前正在RcppArmadillo中提供的sample()命令下苦苦挣扎。当我尝试运行下面的代码时,出现错误no matching function for call to sample,并且已经在前面添加了额外的Rcpp::名称空间,因为在另一个post中效果很好。

我也尝试了其他几个容器类,但是我总是被这个错误困扰。下面是一些代码,它会产生错误。

任何帮助将不胜感激:)

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

// [[Rcpp::export]]
NumericMatrix example(arma::mat fprob,
                      int K) {
  int t = fprob.n_rows;
  IntegerVector choice_set = seq_len(K);
  arma::mat states(t,1); states.fill(0);
  arma::rowvec p0(K);
  arma::rowvec alph(K);
  double fit;

  p0 = fprob.row(t-1);
  fit = accu(p0);
  alph = p0/fit;
  states(t-1,1) = Rcpp::RcppArmadillo::sample(choice_set, 1, false, alph)[0];

  return wrap(states);
}

1 个答案:

答案 0 :(得分:4)

在头文件中定义该函数:

    // Enables supplying an arma probability
    template <class T> 
    T sample(const T &x, const int size, const bool replace, arma::vec &prob_){
      return sample_main(x, size, replace, prob_);
    }

请注意,当您提供arma::vec == arma::colvec时,它期望arma::rowvec。因此,如果将p0alph更改为arma::vec,它应该可以工作。由于缺少样本数据而未经测试...

顺便说一句,同时还有一个Rcpp:::sample()函数,以防您真的不需要Armadillo来完成其他任务。

关于@JosephWood在评论中提出的性能问题: 我的印象是Rcpp::sample()Rcpp::RcppArmadillo::sample()都基于do_sample()。因此,它们在大多数情况下应该非常相似,但我尚未对其进行基准测试。 hash algorithm(在这种情况下为selected at R level)在不进行加权采样的情况下R的较高性能来自This is what it looks like。有趣的是,R 3.6将提供一种新的采样方法,以消除当前方法中存在的偏差。