STL vektörleri
Standart şablon kütüphanesi (stl), esnek algoritmalar ve veri yapıları içeren bir C++ kütüphanesidir. Örneğin, stl'deki double vektörü, Rcpp'in NumericVector türünün "yerel C++" karşılığı gibidir. Aşağıdaki kod, x adlı, on elemanlı standart bir double vektör oluşturur.
std::vector<double> x(10);
Genelde R eşdeğerleri gibi çalışan mean(), round() ve abs() dâhil birçok kullanışlı yönteme erişim sağladığı için Rcpp vektör türlerine bağlı kalmak daha mantıklıdır. Ancak, stl vektörlerinin bir avantajı, her seferinde veri kopyalama maliyeti ödemeden boyutlarını dinamik olarak değiştirebilmeleridir. Bu da bize, önceki egzersizdeki "kötü" işlevde olduğu gibi daha basit kodlar yazma olanağı verirken, "iyi" koddaki performansı koruma imkânı tanır.
Bu egzersiz, kursun bir parçasıdır
Rcpp ile R Kodunu Optimize Etme
Egzersiz talimatları
- Pozitif sayıları seçen, stl vektör tabanlı
select_positive_values_std()tanımını tamamla.- İşlevin dönüş türünü
std::vector<double>kullanarak standart bir double vektör yap. 0boyutunda standart bir double vektör,positive_x, tanımla.fordöngüsündekiifbloğunun içinde,positive_x'inpush_back()yöntemini kullanarakx'in i'nci öğesini ekle.
- İşlevin dönüş türünü
- Karşılaştırma için önceki egzersizdeki
good_select_positive_values_cpp()çalışma alanında mevcut. İki işlevin göreli hızlarını görmek için konsol çıktısını incele.
Uygulamalı etkileşimli egzersiz
Bu egzersizi bu örnek kodu tamamlayarak deneyin.
#include
using namespace Rcpp;
// Set the return type to a standard double vector
// [[Rcpp::export]]
___ select_positive_values_std(NumericVector x) {
int n = x.size();
// Create positive_x, a standard double vector
___;
for(int i = 0; i < n; i++) {
if(x[i] > 0) {
// Append the ith element of x to positive_x
___;
}
}
return positive_x;
}
/*** R
set.seed(42)
x <- rnorm(1e6)
# Does it give the same answer as R?
all.equal(select_positive_values_std(x), x[x > 0])
# Which is faster?
microbenchmark(
good_cpp = good_select_positive_values_cpp(x),
std = select_positive_values_std(x)
)
*/