X-Git-Url: http://git.kpe.io/?p=ctsim.git;a=blobdiff_plain;f=libctsupport%2Fmathfuncs.cpp;fp=libctsupport%2Fmathfuncs.cpp;h=c07445253d3355a5f92df91b67842f7b44d6d904;hp=1773c8b7f6cbc9db54bf7aacb15f297bc776235f;hb=fd1d136a94a6d20013f38d6a997bdfefad0f5e98;hpb=efc398029330f4d9170257db29e4420e50f25625 diff --git a/libctsupport/mathfuncs.cpp b/libctsupport/mathfuncs.cpp index 1773c8b..c074452 100644 --- a/libctsupport/mathfuncs.cpp +++ b/libctsupport/mathfuncs.cpp @@ -2,7 +2,7 @@ ** This is part of the CTSim program ** Copyright (C) 1983-2000 Kevin Rosenberg ** -** $Id: mathfuncs.cpp,v 1.2 2000/08/31 08:38:58 kevin Exp $ +** $Id: mathfuncs.cpp,v 1.3 2000/12/20 20:08:48 kevin Exp $ ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License (version 2) as @@ -81,3 +81,58 @@ normalizeAngle (double theta) return (theta); } + + +void +vectorNumericStatistics (std::vector vec, double& min, double& max, double& mean, double& mode, double& median, double& stddev) +{ + int n = vec.size(); + if (n <= 0) + return; + + mean = 0; + min = vec[0]; + max = vec[0]; + int i; + for (i = 0; i < n; i++) { + double v = vec[i]; + if (v > max) + max = v; + if (v < min) + min = v; + mean += v; + } + mean /= n; + + static const int nbin = 1024; + int hist[ nbin ] = {0}; + double spread = max - min; + mode = 0; + stddev = 0; + for (i = 0; i < n; i++) { + double v = vec[i]; + int b = static_cast((((v - min) / spread) * (nbin - 1)) + 0.5); + hist[b]++; + double diff = (v - mean); + stddev += diff * diff; + } + stddev = sqrt (stddev / n); + + 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 (n % 2) // Odd + median = vec[((n - 1) / 2)]; + else // Even + median = (vec[ (n / 2) - 1 ] + vec[ n / 2 ]) / 2; +}