00001 #ifndef SCTDATA_STAT_H
00002 #define SCTDATA_STAT_H
00003 #include <vector>
00004
00005 namespace SctData{
00006
00013 template <class T>
00014 class Stat {
00015 public:
00016 Stat(T value, bool valid) : value(value), valid(valid) {}
00017 Stat() : valid(true) {;}
00018 T value;
00019 bool valid;
00020 };
00021
00023 template <class T>
00024 class Stats : public vector<Stat<T> >{
00025 public:
00027 Stats<T>();
00029 Stats<T>(const unsigned n);
00031 Stats<T>(const unsigned n, const T t);
00033 Stats<T> (const unsigned n, const Stat<T> s);
00035 void resize(const unsigned n);
00037 void resize(const unsigned n, const T t);
00039 void clear();
00041 T mean() const ;
00043 T var() const ;
00045 unsigned n() const ;
00047 T sum() const ;
00049 T sumSq() const ;
00051 T meanSq() const ;
00053 const Stat<T>& getAt(const unsigned i) const;
00055 Stat<T>& modifyAt(const unsigned i);
00056 protected:
00057
00058 void modified(){ mean_calc=false; var_calc=false, n_calc=false;}
00059
00060 mutable bool mean_calc;
00061 mutable bool var_calc;
00062 mutable bool n_calc;
00063 mutable T m_mean;
00064 mutable T m_var;
00065 mutable unsigned m_n;
00066 private:
00067 const Stat<T> operator[](const unsigned i) const;
00068 Stat<T>& operator[](const unsigned i);
00069 };
00070
00071
00072
00073 template <class T>
00074 inline Stats<T>::Stats<T>() {
00075 modified();
00076 }
00077
00078 template <class T>
00079 inline Stats<T>::Stats<T>(const unsigned n) : vector<Stat<T> >(n, Stat<T>()) {
00080 modified();
00081 }
00082
00083 template <class T>
00084 inline Stats<T>::Stats<T>(const unsigned n, const T t) : vector<Stat<T> >(n, Stat<T>(t, true)) {
00085 modified();
00086 }
00087
00088
00089 template <class T>
00090 inline Stats<T>::Stats<T>(const unsigned n, const Stat<T> s) : vector<Stat<T> >(n, s) {
00091 modified();
00092 }
00093
00094 template <class T>
00095 inline void Stats<T>::clear() {
00096 vector<Stat<T> >::clear();
00097 modified();
00098 }
00099
00100 template <class T>
00101 inline void Stats<T>::resize(const unsigned n) {
00102 if (n!=size()){
00103 modified();
00104 vector<Stat<T> >::resize(n, Stat<T>() );
00105 }
00106 }
00107
00108 template <class T>
00109 inline void Stats<T>::resize(const unsigned n, const T t) {
00110 if (n!=size()){
00111 modified();
00112 vector<Stat<T> >::resize(n, t);
00113 }
00114 }
00115
00116 template <class T>
00117 inline T Stats<T>::mean() const {
00118 if (!mean_calc){
00119 m_mean=sum();
00120 if (n()!=0) m_mean/=n();
00121 mean_calc=true;
00122 }
00123 return m_mean;
00124 }
00125
00126 template <class T>
00127 inline unsigned Stats<T>::n() const {
00128 if (!n_calc){
00129 m_n=0;
00130 for (unsigned i=0; i<size(); ++i){
00131 if (getAt(i).valid) ++m_n;
00132 }
00133 n_calc=true;
00134 }
00135 return m_n;
00136 }
00137
00138 template <class T>
00139 inline T Stats<T>::sum() const {
00140 T sum(0);
00141 for (unsigned i=0; i<size(); ++i){
00142 if (getAt(i).valid) sum+=getAt(i).value;
00143 }
00144 return sum;
00145 }
00146
00147 template <class T>
00148 inline T Stats<T>::sumSq() const {
00149 T sumSq(0);
00150 for (unsigned i=0; i<size(); ++i){
00151 if (getAt(i).valid) {
00152 T val=getAt(i).value;
00153 sumSq += val*val;
00154 }
00155 }
00156 return sumSq;
00157 }
00158
00159 template <class T>
00160 inline T Stats<T>::meanSq() const {
00161 T meansq = sumSq();
00162 if (n()!=0) meansq/=n();
00163 return meansq;
00164 }
00165
00166
00167 template <class T>
00168 T Stats<T>::var() const {
00169 if (!var_calc){
00170 m_mean=mean();
00171 m_var=meanSq()-m_mean*m_mean;
00172 var_calc=true;
00173 }
00174 return m_var;
00175 }
00176
00177 template <class T>
00178 const Stat<T>& Stats<T>::getAt(unsigned i) const{
00179 return vector<Stat<T> >::operator[](i);
00180 }
00181
00182 template <class T>
00183 Stat<T>& Stats<T>::modifyAt(const unsigned i){
00184 modified();
00185 return vector<Stat<T> >::operator[](i);
00186 }
00187
00188 }
00189
00190 #endif //#ifndef SCTDATA_STAT_H