de438b6041d00b72be32bcdec70436a9d201baf2 braney Sat May 21 12:17:40 2016 -0700 libify the guts of ave so I can use it in hgc diff --git src/lib/aveStats.c src/lib/aveStats.c new file mode 100644 index 0000000..fba1586 --- /dev/null +++ src/lib/aveStats.c @@ -0,0 +1,81 @@ +#include "common.h" +#include "aveStats.h" + +static int cmpDouble(const void *va, const void *vb) +/* Compare two slNames. */ +{ +const double *a = va; +const double *b = vb; +double diff = *a - *b; +if (diff < 0) + return -1; +else if (diff > 0) + return 1; +else + return 0; +} + +struct aveStats *aveStatsCalc(double *array, int count) +/* Compute stats on sorted array */ +{ +qsort(array, count, sizeof(array[0]), cmpDouble); + +struct aveStats *as; + +AllocVar(as); +as->count = count; + +double val, minVal = DBL_MAX, maxVal = -DBL_MAX; +double total = 0, average; +int i; +int q1Index, q3Index; /* quartile positions */ +double oneVar, totalVar = 0; + +for (i=0; i val) minVal = val; + if (maxVal < val) maxVal = val; + total += val; + } + +as->average = average = total/count; +as->minVal = minVal; +as->maxVal = maxVal; +as->total = total; + +q1Index = (count+1)/4; /* one fourth, rounded down */ +q3Index = (3*(count+1))/4; /* three fourths, rounded down */ +if (q1Index < (count-1)) + { + double range = array[q1Index+1] - array[q1Index]; + as->q1 = array[q1Index] + + ((((double)count+1.0)/4.0)-(double)q1Index)*range; + } +else + as->q1 = array[q1Index]; +if (q3Index < (count-1)) + { + double range = array[q3Index+1] - array[q3Index]; + as->q3 = array[q3Index] + + ((3.0*((double)count+1.0)/4.0)-(double)q3Index)*range; + } +else + as->q3 = array[q3Index]; + +for (i=0; ivar = totalVar; +if (count > 1) + as->var /= count-1; +as->stdDev = sqrt(as->var); +as->median = array[count/2]; + +return as; +} +