inline パッケージ(関連:Rcpp パッケージ)を使って,C++ で書いたプログラムをインラインで R の関数にすることができる。
速度は素晴らしい(他のやり方は試していないので比較できないが,R で書いたプログラムよりは格段に速い)。
以下のように使う。
# C++ プログラムを cxxfunction で,R の関数にする
library(inline)
src <- '
Rcpp::NumericVector xa(a);
Rcpp::NumericVector xb(b);
int n_xa = xa.size(), n_xb = xb.size();
Rcpp::NumericVector xab(n_xa + n_xb - 1);
for(int i = 0; i < n_xa; i++)
for (int j = 0; j < n_xb; j++)
xab[i + j] += xa[i] * xb[j];
return xab;
'
fun <- cxxfunction(signature(a = "numeric", b = "numeric"), src, plugin = "Rcpp")
# R で関数を定義してみる
fun2 <- function(xa, xb) {
xab <- integer(length(c(xa, xb))-1)
for (i in seq.int(xa))
for (j in seq.int(xb))
xab[i+j-1] <- xab[i+j-1]+xa[i]*xb[j]
return(xab)
}
実行結果は以下の通り
> x <- 1:1000
> y <- 1:1000
> system.time(a <- fun(x, y))
ユーザ システム 経過
0.003 0.000 0.003
> system.time(b <- fun2(x, y))
ユーザ システム 経過
6.298 0.053 6.249
> all.equal(a, b)
[1] TRUE
※コメント投稿者のブログIDはブログ作成者のみに通知されます