r309: plotfile changes
[ctsim.git] / libctsupport / mathfuncs.cpp
index 1773c8b7f6cbc9db54bf7aacb15f297bc776235f..c07445253d3355a5f92df91b67842f7b44d6d904 100644 (file)
@@ -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);
 }
+\r
+\r
+void \r
+vectorNumericStatistics (std::vector<double> vec, double& min, double& max, double& mean, double& mode, double& median, double& stddev)\r
+{\r
+       int n = vec.size();\r
+       if (n <= 0)\r
+               return;\r
+\r
+    mean = 0;\r
+    min = vec[0];\r
+    max = vec[0];\r
+       int i;\r
+    for (i = 0; i < n; 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 /= n;\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 < n; 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 / n);\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 (n % 2)  // Odd\r
+               median = vec[((n - 1) / 2)];\r
+       else        // Even\r
+               median = (vec[ (n / 2) - 1 ] + vec[ n / 2 ]) / 2;\r
+}\r