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
。因此,如果您将 p0
和 alph
更改为 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犰狳中的样本的主要内容,如果未能解决你的问题,请参考以下文章