Для выборки из полиномиального распределения в Rcpp мы можем сделать:
int n = 100;
int k = 3;
arma::vec probs = {0.4,0.2,0.4}
arma::irowvec c(k);
Rcpp::rmultinom(n, probs.begin(), k, c.begin());
Я хотел бы знать, можем ли мы сделать то же самое, когда C — матрица. я попробую
int n = 100;
int k = 3;
arma::vec probs = {0.4,0.2,0.4}
# C (arma::mat C) passed by reference to the function
Rcpp::rmultinom(n, probs.begin(), k, C.row(1).begin());
но выдает ошибку. Есть ли простой способ сделать это?
Я хочу попробовать второй подход, потому что у меня есть большая матрица C, которую я передаю по ссылке в свою функцию, а затем я хочу обновить ее строки после многочлена.
MWE:
#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]
// [[Rcpp::plugins(cpp11)]]
using namespace Rcpp;
using namespace arma;
void subfunction(const arma::imat& C) {
int n = 100;
int k = 3;
arma::vec probs = {0.4,0.2,0.4};
rmultinom(n, probs.begin(), k, C.col(1).begin());
}
// [[Rcpp::export]]
arma::imat myfunction(){
arma::imat C = { {1, 2},
{3, 4},
{5, 6}};
subfunction(C);
Rcpp::Rcout << "C: " << C << std::endl;
}
Ошибка:
test_multim.cpp:18:44: error: ‘class arma::subview_col<int>’
has no member named ‘begin’
rmultinom(n, probs.begin(), k, Ct.col(1).begin());