【问题标题】:using a user defined function in Rcpp (cppFunction)在 Rcpp (cppFunction) 中使用用户定义的函数
【发布时间】:2013-02-18 23:29:56
【问题描述】:

我在 r 中有一个用户定义的函数:

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
}

我想在使用 Rcpp 和 cppFunction 编写的 c++ 代码中使用这个函数。我已经通过文档和示例几次,但没有成功。

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;
                       }')

【问题讨论】:

    标签: r rcpp


    【解决方案1】:

    我建议如下:

    • 研究我们的文档和示例。我们也展示了如何传递函数,即使我们不推荐它(出于明显的性能原因,从 C++ 调用 R 并不快)。

    • 如果您的复杂示例不起作用,请尝试使用较小的示例。归根结底,您可能只需要一个接收两个数字并将其传递给提供的函数的测试器。

    • 最后:你真的想要 C++ 中的blacksch。所有统计函数都可以使用相同的名称。

    【讨论】:

    • 所以我想制作一个 c++ blacksch 是一种可能(并推荐)的解决方案。
    • 需要注意的是,在需要的时候用as&lt;type&gt;()强制转换r函数结果是很重要的。
    • 是的,但您不需要在 cmets 中重复此处的所有 Rcpp 文档。请务必研究我们的小插曲、我们的示例、Rcpp Gallery 之类的内容以及此处和邮件列表中的无数答案。让 Google 成为您最好的新朋友。
    • 我很难找到关于在 cppFunction() 中包含两个函数的任何内容,当我尝试在同一个 cppFunction() 中添加此函数时,我收到如下错误:error: 'blacksch' was not declared in this scope >
    • 我确实想到了。但是看了Rcpp Attributes我还是不明白。我不是专家。我没有声称自己是专家。我正在向专家寻求帮助。我确定我以错误的方式使用该功能,因为它被称为cppFunction 而不是cppFunctions,并且根据经验,我已经证明我正在尝试的方法不起作用。我只是有点不知道从这里去哪里。
    猜你喜欢
    • 1970-01-01
    • 2014-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-12
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    相关资源
    最近更新 更多