образец в Rcpp Armadillo - PullRequest
       54

образец в Rcpp Armadillo

0 голосов
/ 01 марта 2019

Я в настоящее время борюсь с командой sample (), предоставленной в RcppArmadillo.Когда я пытаюсь запустить приведенный ниже код, я получаю сообщение об ошибке 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);
}

1 Ответ

0 голосов
/ 01 марта 2019

Вот определение этой функции из заголовка:

    // 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() и Rcpp::RcppArmadillo::sample() основаны на do_sample().Так что в большинстве случаев они должны быть очень похожими, но я их не сравнивал.Более высокая производительность R для невзвешенной выборки без замены на большие числа обеспечивается алгоритмом хеширования , который в таких случаях выбирается на уровне R .Также интересно отметить, что R 3.6 будет иметь новый метод отбора проб, чтобы устранить смещение, присутствующее в текущем методе.

...