7

昨夜から と を試してきましたがRcppinline今のところとても楽しんでいます。しかし、私はC一般的に初心者で、まだ基本的なことしかできず、関数などについてオンラインでヘルプを見つけるのに苦労しています。

私が取り組んでいたのは、グローバル環境でベクトルの最小値を見つける関数でした。私が思いついた:

library("inline")
library("Rcpp")

foo <- rnorm(100)

bar <- cxxfunction( signature(),
'
Environment e = Environment::global_env();  
NumericVector foo = e["foo"];
int min;

for (int i = 0; i < foo.size(); i++)
{
    if ( foo[i] < foo[min] ) min = i;
}
return wrap(min+1);
', plugin = "Rcpp")

bar()

しかし、これを行うにはもっと簡単な方法があるはずのようで、それはよりもかなり遅いですwhich.max()

system.time(replicate(100000,bar()))
   user  system elapsed 
   0.27    0.00    0.26 
system.time(replicate(100000,which.min(foo)))
   user  system elapsed 
    0.2     0.0     0.2 

c++これを行う基本またはRcpp機能を見落としていますか?もしそうなら、そのような関数のリストはどこにありますか?

この質問は、遅い R 関数を高速化するための C コードの書き方をどこで学べますか? に関連していると思い ます。

しかし、私は に組み込む方法にはあまり興味がなくc++、で使用できる基本的なコードをRどこでどのように学ぶかについてもっと興味があるという点で異なります。c++R

4

1 に答える 1

10

Rcpp がお役に立てば幸いです。

ビリーの最初のコメントはかなり正しいです。関数のルックアップにオーバーヘッドがあり[]、各要素のルックアップにオーバーヘッドがあるなど。

また、より一般的なアプローチは、R にあるベクトルを取得し、インラインおよび Rcpp を介して作成したコンパイル済み関数に渡し、結果を返すようにすることです。それを試してみてください。パッケージにはたくさんの例があり、rcpp-devel メーリング リストのアーカイブに散らばっています。

編集:非常にC++/STLスタイルの回答を設定しようとすることに抵抗できませんでした。

R> src <- '
+   Rcpp::NumericVector x(xs);
+   Rcpp::NumericVector::iterator it =       // iterator type
+     std::min_element(x.begin(), x.end());  // STL algo
+   return Rcpp::wrap(it - x.begin()); '
R> minfun <- cxxfunction(signature(xs="numeric"), body=src, plugin="Rcpp")
R> minfun(c(7:20, 3:5))
[1] 14
R>

これは正確には最も簡単な答えではありませんが、C++ が提供するものを使用することで、C++ レベルでも (明示的な) ループなしで最小限の要素を見つける方法を示しています。しかし、組み込みmin()関数はまだ高速です。

*編集 2: 以下の Romain のコメントに従って修正。

于 2011-03-01T18:43:04.050 に答える