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

Kayan ortalamalar (C++)

Vektörleştirilmiş kayan ortalama fonksiyonu rollmean3() iyi performans veriyordu ama okunabilirliği çok zayıftı. Bu kodun kayan ortalama hesapladığını anlamak gerçekten zor; bu da fonksiyonun hata ayıklamasını ve bakımını güçleştiriyor.

İkinci sürüm olan rollmean2() daha yavaştı ama okumak daha kolaydı. Bunu C++'a çevirirsek, umarız hem kolay okunurluk hem de yüksek hız elde ederiz.

rollmean2() çalışma alanında tanımlı; nasıl çalıştığını anımsamak için tanımını yazdırabilirsin. Şimdi rollmean2()'yi C++'a çevirip rollmean4() olarak atayacaksın.

Bu egzersiz, kursun bir parçasıdır

Rcpp ile R Kodunu Optimize Etme

Kursa Göz Atın

Egzersiz talimatları

  • res'i, uzunluğu n olan ve değerleri NumericVector'ın get_na() metodu tarafından verilen bir NumericVector olarak ayarla.
  • total'ı, x'in ilk window değerleri olarak hesapla.
  • window - 1 konumundaki ortalamayı, toplamın pencerenin genişliğine bölümü olarak hesapla.
  • İkinci döngüde, toplamı x'in i - window. elemanını çıkarıp i. elemanını ekleyerek güncelle.

Uygulamalı etkileşimli egzersiz

Bu egzersizi bu örnek kodu tamamlayarak deneyin.

#include 
using namespace Rcpp;

// [[Rcpp::export]]
NumericVector rollmean4(NumericVector x, int window) {
  int n = x.size();
  
  // Set res as a NumericVector of NAs with length n
  NumericVector res(___, ___::___());
  
  // Sum the first window worth of values of x
  double total = 0.0;
  for(int i = 0; i < window; i++) {
    total += ___;
  }
  
  // Treat the first case seperately
  res[window - 1] = ___ / window;
  
  // Iteratively update the total and recalculate the mean 
  for(int i = window; i < n; i++) {
    // Remove the (i - window)th case, and add the ith case
    total += - ___ + ___;
    // Calculate the mean at the ith position
    res[i] = total / window;
  }
  
  return res;  
}

/*** R
   # Compare rollmean2, rollmean3 and rollmean4   
   set.seed(42)
   x <- rnorm(1e4)
   microbenchmark( 
    rollmean2(x, 4), 
    rollmean3(x, 4), 
    rollmean4(x, 4), 
    times = 5
   )   
*/
Kodu Düzenle ve Çalıştır