gpt4 book ai didi

r - 使用 Rmath.h 中的 pnorm 和 Rcpp

转载 作者:行者123 更新时间:2023-12-04 05:53:23 25 4
gpt4 key购买 nike

我正在尝试使用 pnorm 和 qnorm 等函数用 Rcpp 编写一段 C++ 代码。我可以将这些的 Rcpp 糖版本用于向量,如 https://stackoverflow.com/a/9738848/567015 中所述。 ,但我不需要在向量上执行此操作,而只需在 double 上执行此操作。

如果我理解正确,我可以使用 Rf_从 Rmath.h 获取标量版本的前缀。然而,Rf_pnorm不起作用:

library("inline")
Src <- '
double y = as<double>(x);
double res = Rf_pnorm(y,0.0,1.0);
return wrap(res) ;
'

fx <- cxxfunction( signature(x = "numeric") ,Src, plugin = "Rcpp" )

fx(1)

给出错误:
file10c81a585dee.cpp: In function 'SEXPREC* file10c81a585dee(SEXP)':
file10c81a585dee.cpp:32:32: error: 'Rf_pnorm' was not declared in this scope

经过一些谷歌搜索和反复试验,我发现 Rf_pnorm5确实有效,但需要额外的参数来降低尾部和对数比例:
Src <-  '
double y = as<double>(x);
double res = Rf_pnorm5(y,0.0,1.0,1,0);
return wrap(res) ;
'

fx <- cxxfunction( signature(x = "numeric") ,Src, plugin = "Rcpp" )

fx(1)
## [1] 0.8413447

很好,但我不明白为什么会这样,但是 Rf_pnorm没有。我宁愿使用 Rf_pnorm因为我认为这样可以更容易地为不同的发行版找到正确的代码。

最佳答案

这是使用 Rcpp 更自然的 Rcpp 糖变体:

R> library(inline)
R>
R> Src <- '
+ NumericVector y = NumericVector(x);
+ NumericVector res = pnorm(y,0.0,1.0);
+ return res;
+ '
R>
R> fx <- cxxfunction( signature(x = "numeric") , body=Src, plugin = "Rcpp")
R>
R> fx(seq(0.8, 1.2, by=0.1))
[1] 0.788145 0.815940 0.841345 0.864334 0.884930
R> 
R> fx(1.0) ## can also call with scalar args
[1] 0.841345
R> 

更仔细地查看我们的标题,我们取消定义 pnorm等人来自 Rmath.h为了定义您从 Rcpp 糖中获得的(矢量化)变体。

2012-11-14 编辑:今天发布了Rcpp 0.10.0,你可以打电话做签名 R::pnorm(double, double, double, int, int)如果你想使用针对 Rmath.h 编写的 C 风格的代码. Rcpp 糖仍然为您提供矢量化版本。

关于r - 使用 Rmath.h 中的 pnorm 和 Rcpp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9805100/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com