+
+
+void
+vectorNumericStatistics (std::vector<double> vec, const int nPoints, double& min, double& max, double& mean, double& mode, double& median, double& stddev)
+{
+ if (nPoints <= 0)
+ return;
+
+ mean = 0;
+ min = vec[0];
+ max = vec[0];
+ int i;
+ for (i = 0; i < nPoints; i++) {
+ double v = vec[i];
+ if (v > max)
+ max = v;
+ if (v < min)
+ min = v;
+ mean += v;
+ }
+ mean /= nPoints;
+
+ static const int nbin = 1024;
+ int hist[ nbin ] = {0};
+ double spread = max - min;
+ mode = 0;
+ stddev = 0;
+ for (i = 0; i < nPoints; i++) {
+ double v = vec[i];
+ int b = static_cast<int>((((v - min) / spread) * (nbin - 1)) + 0.5);
+ hist[b]++;
+ double diff = (v - mean);
+ stddev += diff * diff;
+ }
+ stddev = sqrt (stddev / nPoints);
+
+ int max_binindex = 0;
+ int max_bin = -1;
+ for (int ibin = 0; ibin < nbin; ibin++) {
+ if (hist[ibin] > max_bin) {
+ max_bin = hist[ibin];
+ max_binindex = ibin;
+ }
+ }
+
+ mode = (max_binindex * spread / (nbin - 1)) + min;
+
+ std::sort(vec.begin(), vec.end());
+
+ if (nPoints % 2) // Odd
+ median = vec[((nPoints - 1) / 2)];
+ else // Even
+ median = (vec[ (nPoints / 2) - 1 ] + vec[ nPoints / 2 ]) / 2;
+}