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