2011-03-01 17 views
6

Dün geceden beri Rcpp ve inline deniyordum ve şu ana kadar gerçekten zevk alıyorum. Ama ben genel olarak C için yeni ve henüz temel şeyler yapabilir ve işlevleri gibi şeyler hakkında çevrimiçi yardım bulmakta zorlanıyorum.Rcpp içinde minimum vektör bulun

Üzerinde çalıştığım bir şey, global ortamda bir vektörün en azını bulan bir işlevdi. Ben ile geldi:

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() 

Ama bunu yapmak için daha kolay bir yolu olmalı gibi görünüyor ve bu 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 

Ben temel c++ veya Rcpp fonksiyonunu bakan muyum göre oldukça yavaş olduğunu bunu yapar? Ve eğer öyleyse, bu tür işlevlerin bir listesini nerede bulabilirim? Ben kullanılabilecek olan temel c++ kodunu öğrenmek için ama daha nasıl ve nerede, R içinde c++ dahil etmek nasıl gerçekten ilgilenmiyorum ki Where can I learn how to write C code to speed up slow R functions?

ancak farklı:

Bu soru ile ilgilidir tahmin R.

+1

C++ kullanarak min ve max gibi işlemleri hızlandıracağınızdan şüpheliyim - bunlar muhtemelen R. Plus'ta zaten (hızlı) SSE komutları kullanılarak uygulanmaktadır, C++'dan R'ye geçiş ve tersi de ücretsizdir. –

+0

Bunun daha kavramsal olduğu ve bunun çok daha büyük bir C++ fonksiyonunun bir parçası olduğunu anlıyorum. –

cevap

9

Rcpp'yi yararlı bulduğunuza sevindim.

Billy'nin ilk yorumu oldukça doğru. Fonksiyon arayışında ek yük vardır ve her eleman için [] arayışı vardır.

Ayrıca, R'de sahip olduğunuz bir vektörü, üzerinden oluşturduğunuz derlenmiş bir işleve aktarmak çok daha yaygın bir yaklaşımdır. Satır içi ve Rcpp ve sonuç döndürün. Bunu dene. Paket içinde çok sayıda örnek var ve rcpp-devel posta listesi arşivleri üzerinde dağınık.

Düzelt: Çok C++/STL stili yanıtı oluşturmaya çalışmaya dayanamadım. Tam olarak en kolay cevap değil ama C++ sundukları kullanarak bile C++ düzeyinde (açık) döngü olmadan minimum eleman nasıl bulacağınız gösterilmiştir

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> 

. Ancak, yerleşik min() işlevi hala daha hızlıdır.

* Düzen 2: Aşağıda, Roma'nın yorumuna göre düzeltilmiştir.

+0

uygulamasında çalışıyorum ama STL sürümünüz Sacha'nın istediği şey değil: "hang.min" '. –

+1

Çok iyi görünüyor - ama "min_element()" bir yineleyiciyi döndürdüğü için, bunu daha önce yaptığım gibi düzeltebiliriz - örneğin şu anda (doğru şekilde) geri döner 14. –

+0

Rcpp 0.9.16 "hangi_min" değerine sahip olacaktır –