Categories: VC/C++

Calcolare Media e Varianza con la Libreria STL

Gli oggetti funzione di STL sono delle classi template con l’operatore “()“, che può essere anche definito inline. Nella libreria ci sono varie funzioni numeriche come accumulate o inner_product o ancora adiacent_difference, ma ne manca una per fare la media degli elementi di un contenitore, vediamo di colmare questa lacuna.

#include <iostream>
#include <vector>
#include <numeric>

using namespace std;

template <class Iterator, class T>
T average(Iterator first, Iterator last, T t0)
{
   return accumulate(first, last, t0) / distance(first, last);
}

int main(int argc, char** args)
{
   int k;

   vector<int> v(7);
   v[0] = 12;
   v[1] = 6;
   v[2] = 4;
   v[3] = 13;
   v[4] = 15;
   v[5] = 5;
   v[6] = 18;

   // Calcolo la media
   cout << "La media del vettore è: "
      << average(v.begin(), v.end(), 0.0)
      << endl;

   cout << endl;    cin >> k;

   return 0;
}

Nel richiamare la funzione ho inserito un valore double ( 0.0 ) perché voglio che ritorni un valore di questo tipo, se ad esempio inseriamo un intero allora avremo il risultato dello stesso tipo e quindi troncato. La nostra funzione average calcola la media  da due iteratori di input forward, con altri tipi farebbe due passate sulla sequenza di valori perché richiamata una volta per accumulate ed una per distance. Per ovviare a questo problema dobbiamo calcolare la media della lista di valori con questo nuovo metodo:

...
int n = 0;
for (; first != last; n++)
{
   t0 += *first;
   ++first;
}

return t0 / n;
...

Ecco la nuova implementazione della funzione average che questa volta potrà funzionare con ogni contenitore di STL.
Vediamo ora qualcosa di più stimolante, il calcolo dello scarto quadratico medio o varianza che in statistica riveste un ruolo molto importante e si calcola con la formula: V(X) = E(X2) – E(X)2, da questa poi è possibile calcolare la radice quadrata ed avere la deviazione standard.

#include <iostream>
#include <vector>
#include <cmath>

using namespace std;

template <class Iterator, class T>
T average2(Iterator first, Iterator last, T t0)
{
   int n = 0;
   for (; first != last; n++)
   {
      T temp = *first;
      t0 += (temp * temp);
      ++first;
   }

   return t0 / n;
}

template <class Iterator, class T>
T average(Iterator first, Iterator last, T t0)
{
   int n = 0;
   for (; first != last; n++)
   {
      t0 += *first;
      ++first;
   }

   return t0 / n;
}

int main(int argc, char** args)
{
   int k;

   vector v(7);
   v[0] = 12;
   v[1] = 6;
   v[2] = 4;
   v[3] = 13;
   v[4] = 15;
   v[5] = 5;
   v[6] = 18;

   double m1 = average(v.begin(), v.end(), 0.0);
   m1 *= m1;
   double m2 = average2(v.begin(), v.end(), 0.0);

   // Calcolo la media
   cout << "La varianza del vettore è: " << m2 - m1 << endl;
   cout << "La deviazione standard del vettore é: "
      << sqrt(m2 - m1) << endl;

   cout << endl;    cin >> k;

   return 0;
}

Come potete notare le funzioni sono migliorabili, ma sono anche un buon punto di partenza per crearsi una libreria di statistica utilizzando funzioni generiche basate su STL.

Share
Giampaolo Rossi

Sviluppatore di software gestionale da oltre 28 anni.

Recent Posts

MerciGest: il gestionale di magazzino semplice e gratuito

MerciGest è il software gestionale gratuito per Windows che semplifica la gestione del magazzino: giacenze,…

2 giorni ago

Software gestionali con SQL Server: un archivio unico, accessibile ovunque

Tutti i nostri software gestionali possono essere collegati a un database SQL Server, consentendo l’accesso…

4 giorni ago

Come iniziare ad usare MerciGest in 5 minuti

MerciGest è semplice e immediato: basta scaricare e installare il programma per iniziare subito. Al…

6 giorni ago

Cos’è MerciGest e a chi serve

MerciGest è un gestionale di magazzino per Windows pensato per negozi, piccole imprese e artigiani…

1 settimana ago

Introduzione alla Standard Template Library (STL)

La Standard Template Library (STL) è una delle componenti più potenti del C++. Fornisce una…

7 mesi ago

Un Abbonamento per Tutti i Software

Sono arrivato alla convinzione che un abbonamento per tutti i miei software gestionali sia il…

2 anni ago