2013-06-28 2 views
0

J'essaie de calculer la fonction de distribution cumulative pour un ensemble de valeurs.Problème d'histogramme GSL

J'ai calculé l'histogramme en utilisant gsl et j'ai essayé de calculer le CDF à partir d'ici, mais il semble que les valeurs sont décalées d'une position.

C'est le code que je utilise:

gHist = gsl_histogram_alloc((maxRange - minRange)/5); 
gsl_histogram_set_ranges_uniform(gHist, minRange, maxRange); 

for (int j = 0; j < ValidDataCount; j++) 
gsl_histogram_increment (gHist, ValAdd[j]); 

gsl_histogram_pdf * p = gsl_histogram_pdf_alloc(gsl_histogram_bins(gHist)); 
gsl_histogram_pdf_init (p, gHist); 

for (int j = 0; j < gsl_histogram_bins(gHist) + 1 ; j++) 
printf ("%f ", p->sum[j]); 

L'histogramme est comme ceci: 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 .... va sur comme ça. il y a un total de 20 valeurs

Et la cdf est: 0,00 0,05 0,05 0,05 0,05 0,05 0,05 0,05 0,05 0,05 0,05 0,05 0,05 0,05 0,05 0,05 0,1 0,1 ...

Pourquoi est-il un 0 sur la première position? Ne devrait-il pas commencer avec 0.05?

Merci.

+0

réponse est venue assez tard: l'espoir est encore utile. –

Répondre

0

La somme d'allocation GSL est un tableau de taille n + 1, où n est le nombre de segments. Cependant, seules n entrées sont nécessaires pour calculer le pdf. Cette allocation supplémentaire d'un élément se produit parce que GSL définit somme [0] = 0.

dans la source Coode GSL « pdf.c », vous pouvez voir que

gsl_histogram_pdf *gsl_histogram_pdf_alloc (const size_t n) 
{ 
    (...) 
    p->sum = (double *) malloc ((n + 1) * sizeof (double)); 
} 


int gsl_histogram_pdf_init (gsl_histogram_pdf * p, const gsl_histogram * h) 
{ 
    (...) 
    p->sum[0] = 0; 
    for (i = 0; i < n; i++) 
    { 
    sum += (h->bin[i]/mean)/n; 
    p->sum[i + 1] = sum; 
    } 
}