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
Egzersiz talimatları
res'i, uzunluğunolan ve değerleriNumericVector'ınget_na()metodu tarafından verilen birNumericVectorolarak ayarla.total'ı,x'in ilkwindowdeğerleri olarak hesapla.window - 1konumundaki ortalamayı, toplamın pencerenin genişliğine bölümü olarak hesapla.- İkinci döngüde, toplamı
x'ini - window. elemanını çıkarıpi. 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
)
*/