X-Git-Url: http://git.kpe.io/?p=ctsim.git;a=blobdiff_plain;f=libctsupport%2Fmathfuncs.cpp;h=4a96e8f617fd1aa55bbfa77de19698ffa8057d5b;hp=c07445253d3355a5f92df91b67842f7b44d6d904;hb=f7ee98f7d964ed361068179f0e7ea4475ed1abdf;hpb=fd1d136a94a6d20013f38d6a997bdfefad0f5e98 diff --git a/libctsupport/mathfuncs.cpp b/libctsupport/mathfuncs.cpp index c074452..4a96e8f 100644 --- a/libctsupport/mathfuncs.cpp +++ b/libctsupport/mathfuncs.cpp @@ -1,8 +1,8 @@ /***************************************************************************** ** This is part of the CTSim program -** Copyright (C) 1983-2000 Kevin Rosenberg +** Copyright (c) 1983-2001 Kevin Rosenberg ** -** $Id: mathfuncs.cpp,v 1.3 2000/12/20 20:08:48 kevin Exp $ +** $Id$ ** ** 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 @@ -22,21 +22,21 @@ /* NAME - * integrateSimpson Integrate array of data by Simpson's rule - * - * SYNOPSIS - * double integrateSimpson (xmin, xmax, y, np) - * double xmin, xmax Extent of integration - * double y[] Function values to be integrated - * int np number of data points - * (must be an odd number and at least 3) - * - * RETURNS - * integrand of function - */ - -double -integrateSimpson (const double xmin, const double xmax, const double *y, const int np) +* integrateSimpson Integrate array of data by Simpson's rule +* +* SYNOPSIS +* double integrateSimpson (xmin, xmax, y, np) +* double xmin, xmax Extent of integration +* double y[] Function values to be integrated +* int np number of data points +* (must be an odd number and at least 3) +* +* RETURNS +* integrand of function +*/ + +double +integrateSimpson (const double xmin, const double xmax, const double *y, const int np) { if (np < 2) return (0.); @@ -45,7 +45,7 @@ integrateSimpson (const double xmin, const double xmax, const double *y, const i double area = 0; int nDiv = (np - 1) / 2; // number of divisions - double width = (xmax - xmin) / (double) (np - 1); // width of cells + double width = (xmax - xmin) / (double) (np - 1); // width of cells for (int i = 1; i <= nDiv; i++) { int xr = 2 * i; @@ -54,85 +54,86 @@ integrateSimpson (const double xmin, const double xmax, const double *y, const i area += (width / 3.0) * (y[xl] + 4.0 * y[xm] + y[xr]); } - - if ((np & 1) == 0) /* do last trapazoid */ + + if ((np & 1) == 0) /* do last trapazoid */ area += width * (y[np-2] + y[np-1]) / 2; - + return (area); } /* NAME - * normalizeAngle Normalize angle to 0 to 2 * PI range - * - * SYNOPSIS - * t = normalizeAngle (theta) - * double t Normalized angle - * double theta Input angle - */ - -double +* normalizeAngle Normalize angle to 0 to 2 * PI range +* +* SYNOPSIS +* t = normalizeAngle (theta) +* double t Normalized angle +* double theta Input angle +*/ + +double normalizeAngle (double theta) { while (theta < 0.) theta += TWOPI; while (theta >= TWOPI) theta -= TWOPI; - + 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; -} + + +void +vectorNumericStatistics (std::vector 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((((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; +} + +