Kom igångKom igång gratis

Viktat medelvärde (C++-version)

Nu är det dags att omsätta dina kunskaper i praktiken genom att skapa en funktion som beräknar det viktade medelvärdet av en vektor.

Givet en numerisk vektor med datavärden, x, och en numerisk vektor med vikter, w, är det viktade medelvärdet summan av datavärdena multiplicerade med vikterna, dividerat med summan av vikterna. Observera att x och w måste ha samma antal element.

I R beräknas detta med weighted.mean(), som gör sum(x * w) / sum(w).

Den här övningen är en del av kursen

Optimera R-kod med Rcpp

Visa kurs

Övningsinstruktioner

  • Komplettera definitionen av funktionen weighted_mean_cpp().
    • Initiera total_xw och total_w till noll, och n till storleken på x.
    • Ange argumenten till for-loopen, med ett heltal, i, som räknare.
    • Inuti loopen adderar du den i:te vikten till total_w och det i:te datavärdet multiplicerat med den i:te vikten till total_xw.
    • Returnera den totala produkten dividerad med den totala vikten.

Interaktiv övning med praktiskt arbete

Testa den här övningen genom att slutföra den här exempelkoden.

#include 
using namespace Rcpp;

// [[Rcpp::export]]
double weighted_mean_cpp(NumericVector x, NumericVector w) {
  // Initialize these to zero
  double total_w = ___;
  double total_xw = ___;
  
  // Set n to the size of x
  int n = ___;
  
  // Specify the for loop arguments
  for(int i = 0; ___) {
    // Add ith weight
    total_w += ___;
    // Add the ith data value times the ith weight
    total_xw ___;
  }
  
  // Return the total product divided by the total weight
  return ___;
}

/*** R 
x <- c(0, 1, 3, 6, 2, 7, 13, 20, 12, 21, 11)
w <- 1 / seq_along(x)
weighted_mean_cpp(x, w)
# Does the function give the same results as R's weighted.mean() function?
all.equal(weighted_mean_cpp(x, w), weighted.mean(x, w))
*/
Redigera och kör kod