2014-06-14 13 views
5

在R中,rpois可以傳遞描述多個泊松分佈的lambda的向量,例如,將lambda的向量傳遞給Rcpp的rpois

rpois(5, (1:5)*1000) 

# [1] 1043 1974 3002 3930 4992 

以上,對輸出矢量的每個元素是從不同的泊松分佈繪製,爲1000,2000,3000,分別4000和5000,裝置。

如果我有一個arma::mat(使用它們,因爲在其他地方我使用的立方體)包含泊松分佈的lambda表達式,什麼是這些(一次一行)傳遞給rpois內RCPP的最佳方式?

這裏的玩具爲例,從隨後的錯誤信息的摘錄:

library(inline) 
library(RcppArmadillo) 
code <- " 
    using namespace Rcpp; 
    using namespace arma; 
    arma_rng::set_seed(42); // Dirk's seed of choice 

    mat lam = randu(5, 5); // ignore the fact these are all 0-1 
    mat out(5, 5); 

    for (int i = 0; i < 5; i++) { 
    out.row(i) = rpois(5, lam.row(i)); 
    }  

    return(wrap(out)); 
" 

f <- cxxfunction(body=code, plugin="RcppArmadillo") 

# cannot convert 'arma::subview_row<double>' to 'double' for argument '2' 
# to 'Rcpp::NumericVector Rcpp::rpois(int, double)' 

我必須承認,我喜歡的類型轉換的理解C++是相當差。是我試圖做的可能(我的猜測是不可能的,因爲它似乎rpois期待雙倍),還是我需要遍歷矩陣的每個單元格,每次產生一個單一的偏差?

回答

6

從C/C++中,您可以訪問至少2個泊松偏離生成例程(在online manual中搜索rpois)。

它們的聲明如下:

double R::rpois(double mu); 
NumericVector Rcpp::rpois(int n, double mu); 

它們中沒有允許傳遞> 1點的值在mu(又名拉姆達)。第一個函數是R的原始例程,用於實現rpois,正如我們從R stats包(向量化爲w.r.t.所有參數的包)中所知道的。給定一個mu,它返回一個單一的(僞)隨機偏差。

第二個是所謂的Rcpp糖功能。它允許一次計算出n偏差並將它們作爲NumericVector返回(同樣,使用R::rpois)。

換句話說,您應該使用兩個嵌套的for循環來填充矩陣,通過調用R::rpois。不要害怕這樣的做法,這是C++。 :)

+0

一個非常有用的答案,謝謝。還有一個關於搜索在線'Rcpp'手冊的好消息。我現在已經實現了你的建議方法,它工作得很好:)。 – jbaums