BaşlayınÜcretsiz başlayın

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

Kursa Göz Atın

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.
    • 0 boyutunda standart bir double vektör, positive_x, tanımla.
    • for döngüsündeki if bloğunun içinde, positive_x'in push_back() yöntemini kullanarak x'in i'nci öğesini ekle.
  • 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)
)
*/
Kodu Düzenle ve Çalıştır