2012-04-13 7 views
9

RスクリプトをCコードに変換するのは、スピードの理由から、また.exeとしてパッケージ化する能力のためです。私はC言語に新しいです。RコードをCコードに変換

私の質問はC言語ではるかに高速でしょうか?レート制限ステップは、大きなベクトルに何度も適用されるソートアルゴリズムです。私は、Rのベクトル化された機能がこれを助けるか遅くするかどうかはわかりません。また、for-loopsがRで非効率的であることを読みました。

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

+1

どのようなスピードアップを実現したいですか?なぜこれらの操作ではRがCよりもかなり遅くなると思いますか? http://stackoverflow.com/questions/1330944/speed-of-r-programming-languageを勉強しましたか? –

+0

特に、 'rowSums'と' colSums'はすでにかなり高速です - おそらく膨大な量のパフォーマンスを圧縮することはできません(そして、 'Matrix'で非常に豊富なスパース行列サポートを考慮する必要がありますパッケージ、あなたの行列が疎である場合...)。 「他のユーザーのマシンを稼動させる機能」についてもう少し詳しく説明できますか? –

+1

それは多くの仕事、特にespです。 Cプログラミングで最初から始めているからです。手作業でRコードを変換するのに要する時間よりも短い時間で、ユーザーのマシンに[R](http://cran.r-project.org/bin/windows/rw-FAQ.html)をインストールすることができます。 – hardmath

答えて

10

私はこの問題に答えるつもりです。

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

Q:私のRアルゴリズムの方がCで高速でしょうか?

A:はい!アルゴリズムに「最高の」Cコードを書いた方が、おそらく早いでしょう。おそらくと多くの場合、の作業が多いでしょう。

Q:大きなベクトルの並べ替えはCで高速に行うことができますか?

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

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の一部も使用できます)。 。

More info on BLAS

もう一つの方法は、RからCまで、あなたがRのすべての機能にアクセスすることができ、そこからは.callを作ることです! inlineパッケージとRcppパッケージを使用すると、簡単に作業を進めることができます。

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

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

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

+0

ターゲットプラットフォームはWindows(.exeが言及されている)で、おそらくAMD64(32ビットが古くなり、ほとんど誰もItaniumを所有していない)でなければなりません。良いBLASは、コードを劇的にスピードアップすることができるAMD64でAVXを使用します(代替はループです)。そしてCでも、上記のDirkのコメントが適用されます:profile、profile、profile。 –

+0

詳細な対応をありがとう! – JoshDG

関連する問題