使用RcppArmadillo :: sample进行增量采样时的奇怪行为

时间:2018-07-02 20:07:58

标签: r rcpp

我正在尝试使用Rcpp使用polya urn方案来实现一些绘制。基本上,我有一个要从中提取的矩阵,以及一个第二个矩阵,其权重与概率成正比。每次绘制之后,我都需要增加绘制的单元格的重量。

我遇到了一些索引错误,这使我不得不更广泛地检查采样,并且我发现我的体重矩阵正在被RcppArmadillo :: sample修改。两个问题(1)是我应该预期的行为,还是我应该在某个地方报告的错误? (2)对当前的解决方法有什么想法?这是一个可重现的示例:

#include <RcppArmadilloExtensions/sample.h>
// [[Rcpp::depends(RcppArmadillo)]]

using namespace Rcpp ;

// [[Rcpp::export]]
void sampler(int N, int inc, NumericMatrix& weight_matrix, int reps) {

  IntegerVector wm_tmp = seq_along(weight_matrix);
  Rcout << "Initial weight_matrix:\n" << weight_matrix << "\n";

  int x_ind;
  for(int i = 0; i < reps; ++i) {
    x_ind = RcppArmadillo::sample(wm_tmp, 1, true, weight_matrix)(0) - 1;
    Rcout << "Weight matrix after sample: (rep = " << i << ")\n" << weight_matrix << "\n";
    Rcout << "x_ind: " << x_ind  << "\n"; 
    // get indices
    weight_matrix[x_ind] = weight_matrix[x_ind] +  inc;
    Rcout << "Add increment of " << inc << " to weight_matrix:\n" << weight_matrix << "\n";
  }
}
// 
// // [[Rcpp::export]]
// IntegerVector seq_cpp(IntegerMatrix x) {
//   IntegerVector tmp = seq_along(x);
//   IntegerVector ret = RcppArmadillo::sample(tmp, 2, true);
//   return ret;
// }

/*** R
weight_matrix <- matrix(1, 5, 2)
sampler(5, 1, weight_matrix, 3)

weight_matrix <- matrix(1, 5, 2)
sampler(5, 0, weight_matrix, 3)
*/

谢谢!

1 个答案:

答案 0 :(得分:1)

已知和记录的行为。

你可以做

i)使用Rcpp::clone()创建SEXP(即NumericMatrix)的不同副本。

ii)改用Armadillo矩阵,并以const arma::mat & m的形式传递。

有一些架构上的原因与R组织其数据结构的方式有关,这意味着我们不能快速访问(没有副本!),也不能写保护内容。