gpt4 book ai didi

r - 使用 Rcpp Sugar 将均值和标准差传递给 dnorm()

转载 作者:行者123 更新时间:2023-12-04 12:34:43 27 4
gpt4 key购买 nike

我正在将一些 R 代码转换为 Rcpp 代码,并且需要在给定均值向量和标准差向量的情况下计算观察向量的可能性。如果我假设平均值为 0 且标准差为 1,我可以编写此函数(运行此函数需要加载“inline”和“Rcpp”包),

dtest1 = cxxfunction(signature( x = "numeric"),
'Rcpp::NumericVector xx(x);
return::wrap(dnorm(xx, 0.0, 1.0));',
plugin='Rcpp')

结果和预期的一样。

> dtest1(1:3) 
[1] 0.241970725 0.053990967 0.004431848

但是,如果我尝试创建一个函数

dtest2 = cxxfunction(signature( x = "numeric", y="numeric", z="numeric" ),
'Rcpp::NumericVector xx(x);
Rcpp::NumericVector yy(y);
Rcpp::NumericVector zz(z);
return::wrap(dnorm(xx, yy, zz));',
plugin='Rcpp')

这将允许我传递不同的均值和标准差会导致错误,如下所示。有没有办法实现我想要实现的功能,或者我确实需要手动编程法线密度?

错误

Error in compileCode(f, code, language = language, verbose = verbose) :   
Compilation ERROR, function(s)/method(s) not created! file31c82bff9d7c.cpp: In function ‘SEXPREC* file31c82bff9d7c(SEXP, SEXP, SEXP)’:
file31c82bff9d7c.cpp:33:53: error: no matching function for call to
‘dnorm4(Rcpp::NumericVector&, Rcpp::NumericVector&, Rcpp::NumericVector&)’
file31c82bff9d7c.cpp:33:53: note: candidates are:
/home/chris/R/x86_64-pc-linux-gnu-library/3.0/Rcpp/include/Rcpp/stats/norm.h:106:1:
note: template<int RTYPE, bool NA, class T> Rcpp::stats::D0<RTYPE, NA, T> Rcpp::dnorm4(const Rcpp::VectorBase<RTYPE, NA, VECTOR>&, bool)
/home/chris/R/x86_64-pc-linux-gnu-library/3.0/Rcpp/include/Rcpp/stats/norm.h:107:1:
note: template<int RTYPE, bool NA, class T> Rcpp::stats::D1<RTYPE, NA, T> Rcpp::dnorm4(const Rcpp::VectorBase<RTYPE, NA, VECTOR>&, double, bool)
/home/chris/R/x86_64-pc-linux-gnu-library/3.0/Rcpp/include/Rcpp/stats/norm.h:108:1:
note: template<int RTYPE, bool NA, class T> Rcpp::stats::D2<RTYPE, NA, T> Rcpp::dnorm4(const Rcpp::VectorBase<RTYPE, NA,
In addition: Warning message:
running command '/usr/lib/R/bin/R CMD SHLIB file31c82bff9d7c.cpp 2> file31c82bff9d7c.cpp.err.txt' had status 1

最佳答案

dnorm 仅根据第一个参数进行矢量化。

为了简化(它稍微复杂一些,但我们在这里还不需要关心这个),调用

dnorm(xx, 0.0, 1.0)

使用重载

NumericVector dnorm( NumericVector, double, double )

第二个调用尝试使用类似

的东西
NumericVector dnorm( NumericVector, NumericVector, NumericVector )

未实现。我们可以实现它,它必须在我们的优先级列表中排得足够高。

与此同时,编写一个小的包装器很容易,比如(这不处理参数长度等......):

NumericVector my_dnorm( NumericVector x, NumericVector means, NumericVector sds){
int n = x.size() ;
NumericVector res(n) ;
for( int i=0; i<n; i++) res[i] = R::dnorm( x[i], means[i], sds[i] ) ;
return res ;
}

关于r - 使用 Rcpp Sugar 将均值和标准差传递给 dnorm(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18152992/

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