muttenz's blog

スイス星空だより

R上でPDMをCも使って動かしてみよう

Katさんが周期解析にペランソやR言語仕様のpergrmよりはるかに速いPDMを使ったらと、勧めてくださいました[vsolj 11505]。ところがそれにはRだけではなくC言語の部分もあるのでそれをRから動かせるようにしなければならない。

ありがたいことにIakさんが彼のブログで[vsolj 9967]にしたがってインストールなどなさった状況を詳しく書いてくださっている。

(http://blog.goo.ne.jp/imako009/e/5d80ee68888c948637c96566d4ba73d4,

http://blog.goo.ne.jp/imako009/e/a200a686eba03b31ae13032889d2f31c )

その記事にしたがって三つのソフトをダウンロード、インストールした。(実際には全部はいらないようです。最初のだけで十分みたい)

次に、pdmr.cを コンパイルするために、pdmr.cが入っているディレクトリで「Rcmd SHLIB」のコマンドをやろうとしたが、そんなコマンドはないという!Katさんのオリジナルを見たら、コマンドは「R CMD SHLIB」となっていて、それをやったら今度はなんか動いてるみたい。だいぶ時間がかかって、もうこれはダメかと思った頃に、ぽこっとファイルがひとつ、もうしばらくしたらポコッともう一つファイルが作られた!

pdmc.dll とpdmc.oの二つのファイル。バンザイ。

そこで、次の段階。Rのプロンプトでsource("pdminit.R")をやったら、なんとIakさんとおんなじハメに。

> source("pdminit.R")
以下にエラー inDL(x, as.logical(local), as.logical(now), ...) : 
共有ライブラリ 'D:/R/PDM/pdmr.dll' を読み込めません: 
LoadLibrary failure: %1 は有効な Win32 アプリケーションではありません。

が出ました!(僕のはドイツ語のWindowsなので日本語ではなかったけど)

使っているRは何度も確かめたが、僕のは64ビット版。

どうしたら良いのでしょうか?どなたか助けて下さい。

とここまで書いて、もう一度考えなおし、改めてコンパイルさせてみたら、大成功!source("pdminit.R")が動きました!

(最初にコンパイルした時点では、Rのパスが32ビットと64ビット両方がが入っているディレクトリまでしか繋げていなかったので、パスを¥x64ともう一段階下まで伸ばしてからもう一度コンパイルしたのが良かったのでしょう。そうしたら64ビット版のdllファイルが出来たようです。ところでコンパイルに随分時間はかかるんですね?)

試しに、この間から試験に使っているASASA111707+0402.9のCSSデータを読み込ませて0.1-0.5を400000分割で解析させました。なんと約7秒で終わった!

(データ数は293)もちろん、結果はOK。P=0.1701932 +/- 0.0000003

Katさん、Iakさんありがとうございます!!!

f:id:muttenz:20130423053820j:plain