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
Oefeninstructies
- Maak de definitie van de functie
weighted_mean_cpp()af.- Initialiseer
total_xwentotal_wop nul, ennop de grootte vanx. - Specificeer de argumenten van de
for-lus, met een integerials teller. - Voeg binnen de lus het i-de gewicht toe aan
total_wen de i-de gegevenswaarde maal het i-de gewicht aantotal_xw. - Retourneer het totale product gedeeld door het totale gewicht.
- Initialiseer
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))
*/