Rcpp犰狳中的样本

Posted

技术标签:

【中文标题】Rcpp犰狳中的样本【英文标题】:sample in Rcpp Armadillo 【发布时间】:2019-03-01 20:24:33 【问题描述】:

我目前正在努力使用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);


【问题讨论】:

Rcpp::RcppArmadillo::sample?? 我很确定这个问题也是重复的......所以如果有人有时间搜索它,我们可能会关闭它。 【参考方案1】:

这里是标题中该函数的定义:

    // 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() 功能,以防您真的不需要犰狳来完成其他任务。

关于@JosephWood 在 cmets 中提出的性能问题: 我的印象是Rcpp::sample()Rcpp::RcppArmadillo::sample() 都是基于do_sample()。所以在大多数情况下它们应该非常相似,但我没有对它们进行基准测试。 R 对于未加权采样而不替换较大数字的更高性能来自hash algorithm,在这种情况下为selected at R level。值得注意的是,R 3.6 将有一种新的采样方法,以消除当前方法中存在的偏差。

【讨论】:

谢谢,现在可以了!我对 rcpp 很陌生,所以感谢您的建议。 应该注意Rcpp::sample 以整数为界,而基数 R 中的sample 可以接受大小为 4e15 的数字。此外,当输入大于 1e7 时,基本 R 样本要快得多。 @JosephWood 而Rcpp::RcppArmadillo::sample() 在这两个方面都与Rcpp::sample() 相当,对吧? 另外,在 arma 的源代码中,我们看到对大于 1e7 github.com/RcppCore/RcppArmadillo/blob/… 的数字进行了检查。最后,我希望你会知道,因为我知道你是一个随机数专家。为此,感谢您的所有贡献。 @JosephWood 我看过不同的采样方法,但不记得细节了。我刚刚刷新了记忆,并用我的(当前)理解更新了答案。

以上是关于Rcpp犰狳中的样本的主要内容,如果未能解决你的问题,请参考以下文章

犰狳中的 Rcpp 糖命令

从 Rcpp 中获取与基 R 相同的整数样本

使用 Rcpp 通过引用传递犰狳稀疏矩阵

在犰狳矩阵中具有概率的矢量化 Rcpp rbinom

在rcpp犰狳中将向量与double进行比较

犰狳的 print() 方法和 cout 从 Rcpp 调用时的顺序不一致