裏 RjpWiki

Julia ときどき R, Python によるコンピュータプログラム,コンピュータ・サイエンス,統計学

C++ コードをインラインで R の関数にする

2011年11月02日 | ブログラミング

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

コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« ダメ出し:Rで円周率計算 | トップ | 様々な言語によるコードをイ... »
最新の画像もっと見る

コメントを投稿

ブログラミング」カテゴリの最新記事