R 2.13.0のコンパイラをつかってみる (2) Cλ
http://ito-hi.blog.so-net.ne.jp/2011-04-21
Morisita の Cλ を求めるのに,行ごとの組合せで n.cmm × n.cmm 回 clambda 関数を呼んでいるが,無駄。
対称行列なのだから,せめて半分だけ計算する。
以下,原著者によるプログラムのパフォーマンス
> system.time(a1 <- mclambda(cmm))
ユーザ システム 経過
10.360 0.136 10.423
> system.time(a2 <- mclambda2(cmm)) # コンパイル版
ユーザ システム 経過
7.993 0.188 8.127
> system.time(a3 <- c.mclambda(cmm)) # コンパイル版
ユーザ システム 経過
7.093 0.278 7.333
ベクトル演算を使えば,コンパイル無しで,コンパイルしたものより 100 倍速くなる。
以下だけで,480×480 の組合せの Cλ が一挙に得られる。
> system.time({
+ n1n2 <- rowSums(cmm)
+ l1l2 <- rowSums(cmm*(cmm-1))/(n1n2*(n1n2-1))
+ cc <- cmm%*%t(cmm)
+ l1pl2 <- outer(l1l2, l1l2, "+")
+ n1mn2 <- outer(n1n2, n1n2, "*")
+ ans <- 2*cc/(l1pl2*n1mn2)
+ })
ユーザ システム 経過
0.072 0.011 0.083 # 100 倍速!!
当然ながら,結果は等しい
> all.equal(a1, ans)
[1] TRUE
> all.equal(a2, ans)
[1] TRUE
> all.equal(a3, ans)
[1] TRUE
最新の画像[もっと見る]
- さぬきうどん 山よし 佐文店 12時間前
- さぬきうどん 山よし 佐文店 12時間前
- 算額(その1394) 23時間前
- 算額(その1393) 1日前
- 和算の心(その008) 1日前
- ぶっかけうどん はな庄 2日前
- ぶっかけうどん はな庄 2日前
- 晴屋製麺所 2日前
- 晴屋製麺所 2日前
- 算額(その1391) 3日前
※コメント投稿者のブログIDはブログ作成者のみに通知されます