Rcpp 犰狳中的样本
sample in Rcpp Armadillo
我目前正在努力使用 RcppArmadillo
中提供的 sample() 命令。当我尝试 运行 下面的代码时,我得到错误 no matching function for call to sample
并且我已经在前面添加了额外的 Rcpp::
命名空间,因为这在另一个 .
我也尝试了其他几个容器类,但我总是遇到这个错误。下面是一些产生错误的代码。
任何帮助将不胜感激:)
#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);
}
这里是 header:
中那个函数的定义
// 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()
功能,以防您真的不需要 Armadillo 来完成其他任务。
关于@JosephWood在评论中提出的性能问题:
我的印象是 Rcpp::sample()
and Rcpp::RcppArmadillo::sample()
are based on do_sample()
. So they should be quite similar in most cases, but I have not benchmarked them. The higher performance of R for unweighted sampling without replacement for larger numbers comes from the hash algorithm, which is selected at R level 在这种情况下。同样有趣的是,R 3.6 将有一个新的采样方法,以消除当前方法中存在的偏差。
我目前正在努力使用 RcppArmadillo
中提供的 sample() 命令。当我尝试 运行 下面的代码时,我得到错误 no matching function for call to sample
并且我已经在前面添加了额外的 Rcpp::
命名空间,因为这在另一个
我也尝试了其他几个容器类,但我总是遇到这个错误。下面是一些产生错误的代码。
任何帮助将不胜感激:)
#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);
}
这里是 header:
中那个函数的定义 // 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()
功能,以防您真的不需要 Armadillo 来完成其他任务。
关于@JosephWood在评论中提出的性能问题:
我的印象是 Rcpp::sample()
and Rcpp::RcppArmadillo::sample()
are based on do_sample()
. So they should be quite similar in most cases, but I have not benchmarked them. The higher performance of R for unweighted sampling without replacement for larger numbers comes from the hash algorithm, which is selected at R level 在这种情况下。同样有趣的是,R 3.6 将有一个新的采样方法,以消除当前方法中存在的偏差。