2013-02-18 19 views
2

我有一個用戶定義的函數在R:使用RCPP(cppFunction)的用戶定義的函數

blacksch<-function(s_0,k,sigma,r,t) 
{ 
    d1=(log(s_0/k) + (r + (sigma^2)/2)*(t))/(sigma*sqrt(t)) 
    d2=(log(s_0/k) + (r - (sigma^2)/2)*(t))/(sigma*sqrt(t)) 

    p=(pnorm(-d2)*k*exp(-r*t))-pnorm(-d1)*s_0 
} 

而且我想在C使用此功能++,我使用RCPP和cppFunction編寫的代碼。我已經通過文檔和例子幾次,但沒有成功。

bs_martin<-cppFunction('NumericMatrix compMartin (NumericMatrix st, NumericMatrix dv, double s_0, double k, 
         double t, double sigma, double r, int steps, int paths, Function blacksch(fun)) { 

         // Ensure RNG scope set 
         RNGScope scope; 


     int min_bs_step=0; 
     double minbsvalue=0; 
     vector<double> u[0]=100.0; 
     for(int i=1;i<=paths; i++) 
     { 
      min_bs_step=0; 
      for(int j=1;j<=steps;j++) 
      { 
      if (dv[i,j]>0 && min_bs_step==0) 
      { 
       min_bs_step=i; 
       minbsvalue=blacksch(s_0,k,sigma,r,t); 
      } 
      else if (min_bs_step!=0) 
      { 
       dv[i,j]=1 - minbsvalue; 
      } 
      } 

     } 
     return dv; 
         }') 

回答

0

我建議如下:

  • 學習我們的文檔和例子。我們也展示瞭如何傳遞函數,即使我們不推薦它(出於明顯的性能原因,從C++調用R不是很快)。

  • 如果你有些複雜的例子不起作用,嘗試一個較小的例子。在一天結束時,您可能只需要一臺接收兩個數字並將其傳遞給提供的功能的測試儀。

  • 最後:你真的想在C++也。所有的統計功能都可以使用相同的名稱。

+0

所以我想製作一個C++'blacksch'是一個可能(和推薦)的解決方案。 – mrkb80 2013-02-18 23:52:41

+0

需要注意的是,在需要時使用'as ()'來投射r函數結果非常重要。 – mrkb80 2013-02-19 00:10:24

+0

是的,但您不需要在評論中重複所有的Rcpp文檔。請仔細研究我們的小插曲,我們的例子,像Rcpp Gallery的東西,以及這裏和郵件列表上的無數答案。讓Google成爲你最好的新朋友。 – 2013-02-19 00:12:57