Aan de slagGa gratis aan de slag

Gewogen gemiddelde (C++-versie)

Tijd om je vaardigheden in de praktijk te brengen door een functie te maken die het gewogen gemiddelde van een vector berekent.

Gegeven een numerieke vector met gegevenswaarden, x, en een andere numerieke vector met gewichten, w, is het gewogen gemiddelde de som van de gegevenswaarden maal de gewichten, gedeeld door de som van de gewichten. Let op: x en w moeten evenveel elementen hebben.

In R bereken je dit met weighted.mean(), die sum(x * w) / sum(w) doet.

Deze oefening maakt deel uit van de cursus

R-code optimaliseren met Rcpp

Cursus bekijken

Oefeninstructies

  • Maak de definitie van de functie weighted_mean_cpp() af.
    • Initialiseer total_xw en total_w op nul, en n op de grootte van x.
    • Specificeer de argumenten van de for-lus, met een integer i als teller.
    • Voeg binnen de lus het i-de gewicht toe aan total_w en de i-de gegevenswaarde maal het i-de gewicht aan total_xw.
    • Retourneer het totale product gedeeld door het totale gewicht.

Praktische interactieve oefening

Probeer deze oefening eens door deze voorbeeldcode in te vullen.

#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))
*/
Code bewerken en uitvoeren