将长度为 1 的 NumericVector 的 rnorm 输出转换为双精度?

Convert rnorm output of NumericVector with length of 1 to a double?

在下面的代码中,我试图从正态分布中生成 NumericVector 个值,其中每次 rnorm() 每次都以不同的均值和方差调用。

代码如下:

// [[Rcpp::export]]
NumericVector generate_ai(NumericVector log_var) {

  int log_var_length = log_var.size();

  NumericVector temp(log_var_length);

  for(int i = 0; i < log_var_length; i++) {
    temp[i] = rnorm(1, -0.5 * log_var[i], sqrt(log_var[i]));
  }

  return(temp);
}

给我带来麻烦的是这条线:

temp[i] = rnorm(1, -0.5 * log_var[i], sqrt(log_var[i]));

它导致错误:

assigning to 'typename storage_type<14>::type' (aka 'double') from incompatible type 'NumericVector' (aka 'Vector<14>')

由于我 return 从 rnorm 中输入一个数字,有没有办法将此 NumericVector return 类型转换为 double

Rcpp 提供了两种访问RNG 采样方案的方法。第一个选项是单次抽奖,第二个选项使用甜甜 Rcpp sugar 启用 n 抽奖。在您当前的设置下,您选择了以后的设置。

选项 1. 通过 R:: 访问 RNG 函数,仅使用标量采样方案而不是糖,例如

temp[i] = R::rnorm(-0.5 * log_var[i], sqrt(log_var[i])); 

选项2。NumericVector上使用子集运算符获取唯一元素。

// C++ indices start at 0 instead of 1
temp[i] = Rcpp::rnorm(1, -0.5 * log_var[i], sqrt(log_var[i]))[0];

优先选项会更快更好。为什么你会问?

嗯,选项 2 创建一个新的 NumericVector,通过调用 选项 1 填充它,然后需要一个子集操作检索值 ,然后 将其分配给所需的标量。

无论如何,RNG 可能有点令人困惑。只需确保始终在函数调用前加上正确的命名空间(例如 R::Rcpp::),这样您和未来的程序员就可以避免对您选择的采样方案类型产生任何歧义。

(这是using namespace Rcpp;的缺点之一)