Есть ли способ для функции dpois Rcpp, где я могу отправить вектор `theta` в качестве параметра?

В R функция после (распределение яда) можно использовать как dpois(x,theta) с обоими x и theta быть векторами. Однако в Rcpp его так использовать нельзя. Может ли кто-нибудь предложить какую-либо функцию для замены цикла в следующем dtpoi0 функция.

#include <algorithm>
#include <RcppArmadillo.h>

using namespace Rcpp;
using namespace arma;


// [[Rcpp::depends("RcppArmadillo")]]
// [[Rcpp::export]]
imat misy(const ivec& x) {
  const int s1 = std::min(x(0), x(1));
  const int s2 = std::min(x(0), x(2));
  const int s3 = std::min(x(1), x(2));
  imat missy(3, 1, fill::zeros);
  
  for (int i = 0; i <= s1; ++i) {
    for (int j = 0; j <= s2 and i + j <= x(0); ++j) {
      for (int k = 0; k <= s3 and i + k <= x(1) and j + k <= x(2); ++k) {
        missy = join_rows(missy, ivec{i, j, k});
      }
    }
  }
  missy.shed_col(0);
  return (missy);
}

// [[Rcpp::export]]
double dtpoi0(const ivec& x, const vec& theta) {
  imat missy = misy(x);
  double fvalue = 0.0;
  missy.each_col([&](ivec& v) {
    ivec u=join_cols(x - v(uvec{0, 0, 1}) - v(uvec{1, 2, 2}), v);
    double prod = 1;
    for (int i = 0; i < (int (u.n_elem)); ++i) {
      prod *= R::dpois(u(i), theta(i), 0);
    }
    fvalue += prod; 
  });
  return fvalue;
}

0

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *