10

速度の理由と、Rスクリプトを.exeとしてパッケージ化できるようにするために、RスクリプトをCコードに変換することを検討しています。私はCに不慣れです。

私の質問は、Cでは大幅に高速になるのでしょうか?律速段階は、大きなベクトルに何度も適用する必要があるソートアルゴリズムです。Rのベクトル化された機能がこれを助けるのか、それとも遅くするのかはわかりません。また、Rではforループが非効率的であることも読みました。

これをCで行う必要がある場合、基本的な行列操作など、Rのデータ処理関数の一部を模倣するのに役立つライブラリはどれですか。どこから始めればいいですか?今のところ、データをC(カンマ区切りのテキストファイル)に読み込む方法すらわかりません。

4

1 に答える 1

12

私はできる限りこの質問に答えようとします。

...しかし、あなたが尋ねていない質問はおそらくもっと関連性があります:RアルゴリズムをRでより速くすることができますか?ここでの答えは通常「はい」です。それは「十分に速い」ことができますか?まあ、それは試してみなければ(そして現在のRコードを見ずに)答えることは不可能です。

Q:私のRアルゴリズムはCでより速くなりますか?

A:はい!アルゴリズムに「最適な」Cコードを記述した場合、おそらくより高速になります。そうすることは、おそらくもっと多くの仕事になるでしょう。

Q:Cでは、大きなベクトルの並べ替えをより高速に実行できますか?

A:はい。マルチスレッドを使用すると、速度を大幅に向上させることができます。...しかしsort(x, method='quick')、Rを呼び出すことから始めて、それが状況を改善するかどうかを確認してください!デフォルトの方法は、ランダムデータに対してはそれほど高速ではありません。

x <- runif(1e7)
system.time( sort(x) )                   # 2.50 secs
system.time( sort(x, method='quick') )   # 1.37 secs
#system.time( tommysort(x) )             # 0.51 secs (4 threads)

Q:どのライブラリが基本的なR機能を模倣していますか?

A:LAPACK / BLASはRで行列演算を処理します。必要なのがそれだけの場合は、Rのバニラライブラリよりもはるかに高速なライブラリを見つけることができます(パフォーマンスを向上させるためにRでもそれらの一部を使用できます!)。

BLASの詳細

もう1つの方法は、RからCに.Callを作成することです。そこから、Rのすべての機能にアクセスできます。inlineパッケージとRcppパッケージはそれを簡単にするのに役立ちます。

3番目の方法は、アプリケーションにRを埋め込むことです。Rinsideそれを簡単にするのに役立ちます。

Q:CSVデータをCに読み込むにはどうすればよいですか?

A:fopenfscanf関数を見てください。...そしてそれらを使用してデータインポート関数を記述します。

于 2012-04-13T18:11:10.937 に答える