3

長いループを必要とする関数 (事後分布) を評価する必要があります。明らかに、R 自体の中でこれを行いたくないので、"inline" と "Rcpp" を使用して C++ を実装しています。ただし、各ループで R 関数を使用する場合、cxxfunction の実行速度は R コードの実行と同じくらい遅いことがわかりました (以下のコードと出力を参照)。特に、各ループ内で多変量正規累積分布関数を使用する必要があるため、mvtnorm パッケージの pmvnorm() を使用しています。

この R 関数を cxxfunction 内で使用して速度を上げるにはどうすればよいですか? 将来 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 
4

1 に答える 1

28

Rcpp から R 関数を呼び出しています。

これは、R 関数を直接呼び出すよりも高速ではありません。

バインディング制約は、呼び出す関数であり、呼び出し方ではありません。Rcpp は魔法の R-to-C++ コンパイラではありません。

于 2013-04-19T18:48:07.663 に答える