我需要评估一个需要长循环的函数(后验分布).显然我不想在R本身内这样做,因此我使用"inline"和"Rcpp"来实现C++.但是,我发现在每个循环使用R函数的情况下,cxx函数的运行速度与运行R代码一样慢(参见下面的代码和输出).特别是,我需要在每个循环中使用多元正态累积分布函数,因此我使用mvtnorm包中的pmvnorm().
如何在cxx函数中使用此R函数并加快速度?我想了解为什么会这样,所以我将来可以在cxxfunction中使用其他R函数.
谢谢.
test <- cxxfunction(
signature(Num="integer",MU="numeric",Sigma="numeric"),
body='
RNGScope scope;
Environment stats("package:mvtnorm");
Function pmvnorm = stats["pmvnorm"];
int num = Rcpp::as<int>(Num);
NumericVector Ret(1);
NumericMatrix sigma(Sigma);
NumericVector mu(MU);
NumericVector zeros(2);
for(int i = 0; i < num; i++)
{
Ret = pmvnorm(Named("upper",zeros),Named("mean",MU),Named("sigma",sigma));
}
return Ret;
',plugin="Rcpp"
)
system.time(
test(10000,c(1,2),diag(2))
)
user system elapsed
5.64 0.00 5.75
system.time(
for(i in 1:10000){
pmvnorm(upper=c(0,0),mean=c(1,2),sigma=diag(2))
}
)
user system elapsed
5.46 0.00 5.57
Run Code Online (Sandbox Code Playgroud) 我X在R中有一个包.该包有一个功能foo().我想foo()在cpp文件中调用该函数(使用Rcpp).可能吗?
#include <Rcpp.h>
void function01() {
// call foo() from package X ??
}
Run Code Online (Sandbox Code Playgroud)