00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #include <iostream>
00014 #include <iomanip>
00015 #include <math.h>
00016 #include "histogram.h"
00017
00018 using namespace std;
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 void Histogram::setup(vector<float> &x)
00033 {
00034 minv = maxv = x[0];
00035 amaxv = fabs(x[0]);
00036 double ttl = 0;
00037 double ttlsqr = 0;
00038 for(unsigned long i = 0; i < x.size(); i++) {
00039 if( x[i] > maxv ) maxv = x[i];
00040 if( x[i] < minv ) minv = x[i];
00041 if( fabs(x[i]) > amaxv ) amaxv = fabs(x[i]);
00042 ttl += x[i];
00043 ttlsqr += x[i]*x[i];
00044 }
00045 meanv = ttl/x.size();
00046 stddevv = ttlsqr/x.size() - meanv*meanv;
00047 stddevv = stddevv > 0 ? sqrt(stddevv) : 0;
00048
00049 return;
00050 }
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064 void Histogram::build(vector<float> &x, const float minr, const float maxr)
00065 {
00066 nbin=2048;
00067 h.clear();
00068 h.resize(nbin);
00069 long n = x.size();
00070
00071 hmax=0;
00072 for(long i = 0; i < n; i++) {
00073 long bin = (long)(nbin*(x[i]-minr)/(maxr-minr));
00074 if( (bin < 0) || (bin >= nbin) ) continue;
00075 h[bin]++;
00076 if( h[bin] > hmax ) hmax = h[bin];
00077 }
00078
00079 return;
00080 }
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092 float Histogram::operator()(const float x) const
00093 {
00094 long bin = (long)(nbin*x);
00095 if( (bin < 0) || (bin >= nbin) )
00096 return 0;
00097 return ((float)h[bin])/hmax;
00098 }
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113 float Histogram::operator()(const float x0, const float x1) const
00114 {
00115 long bin0 = (long)(nbin*x0);
00116 long bin1 = (long)(nbin*x1);
00117
00118 if( (bin0 < 0) || (bin1 >= nbin) )
00119 return 0;
00120
00121 if( bin0 == bin1 ) return ((float)h[bin0])/hmax;
00122
00123 float y = 0;
00124 for(long i = bin0; i <= bin1; i++)
00125 y += h[i];
00126 y /= bin1-bin0+1;
00127 return y/hmax;
00128 }