2016-08-16 53 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 ::的好資源的方向嗎? –

相關問題