2016-08-16 57 views
-1

在下面的代码中,我试图从正态分布中生成一个值为NumericVector的值,其中每次调用rnorm()时每次都有不同的均值和方差。将长度为1的NumericVector的rnorm输出转换为double?

下面是代码:

// [[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>')

因为我m从rnorm返回一个号码,有没有办法将此转换成NumericVector返回t ype到double

回答

1

Rcpp提供了两种访问RNG采样方案的方法。第一个选项是单抽签,第二个选项使n抽签使用一些甜美的甜点Rcpp sugar。在你目前的设置下,你正在选择后面的设置。

选项1.通过R::,例如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;的缺点之一)

+0

非常好!谢谢你的洞察力。我其实是想出了你的选项2,但选项1给了我一些关于我的代码的其他部分的想法!我很好奇,为什么你说第一个选项会更快? –

+0

**选项2 **创建一个新的'NumericVector',通过调用** Option 1 **来填充它,然后需要子集操作。 – coatless

+0

谢谢你的解释。你能告诉我为什么你的Option 1 rnorm只有两个参数吗?为什么第一个参数中没有1?同样,你能指出我使用R ::的好资源的方向吗? –

相关问题