使用内联和Rcpp调用R函数仍然和原始R代码一样慢

使用内联和Rcpp调用R函数仍然和原始R代码一样慢,r,inline,rcpp,R,Inline,Rcpp,我需要评估一个需要长循环的函数(后验分布)。显然,我不想在R本身中这样做,所以我使用“内联”和“RCPP”来实现C++。但是,我发现在每个循环使用R函数的情况下,CXX函数的运行速度与运行R代码的速度一样慢(请参见下面的代码和输出)。特别是,我需要在每个循环中使用多元正态累积分布函数,因此我使用了mvtnorm包中的pmvnorm() 如何在CXX函数中使用此R函数并加快速度?我想了解为什么会发生这种情况,以便将来可以在cxxfunction中使用其他R函数 多谢各位 test <- cx

我需要评估一个需要长循环的函数(后验分布)。显然,我不想在R本身中这样做,所以我使用“内联”和“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 
test您正在从Rcpp调用一个R函数

这不能比直接调用R函数快

绑定约束是您调用的函数,而不是您如何调用它。Rcpp不是什么神奇的R-to-C++编译器