00001
00002
00003
00004 #include <cmath>
00005
00006
00007 #include "DataCorr.h"
00008
00009
00010 Anp::DataCorr::DataCorr()
00011 :fSampleSize(0),
00012 fData()
00013 {
00014 }
00015
00016
00017 Anp::DataCorr::~DataCorr()
00018 {
00019 }
00020
00021
00022 unsigned int Anp::DataCorr::Fill(DataIter ibeg, DataIter iend)
00023 {
00024 for(DataIter xit = ibeg; xit != iend; ++xit)
00025 {
00026 const short key_x = xit -> Key();
00027 const float data_x = xit -> Data();
00028
00029 for(DataIter yit = xit + 1; yit != iend; ++yit)
00030 {
00031 if(xit == yit)
00032 {
00033 continue;
00034 }
00035
00036 const short key_y = yit -> Key();
00037 const float data_y = yit -> Data();
00038
00039 const Corr::Key key(key_x, key_y);
00040
00041 Corr::Data &data = fData[key];
00042
00043 data.sum_x += data_x;
00044 data.sum_y += data_y;
00045 data.sum_xx += data_x * data_x;
00046 data.sum_xy += data_x * data_y;
00047 data.sum_yy += data_y * data_y;
00048 }
00049 }
00050
00051 return ++fSampleSize;
00052 }
00053
00054
00055 const Anp::Corr::CorrMap Anp::DataCorr::GetCorrCoef() const
00056 {
00057 Corr::CorrMap cmap;
00058
00059 if(fSampleSize < 2)
00060 {
00061 std::cerr << "DataCorr::GetCorrCoef() - sample size is too small" << std::endl;
00062 return cmap;
00063 }
00064
00065 const double inv_size = 1.0/double(fSampleSize);
00066
00067 for(Corr::DataMap::const_iterator dit = fData.begin(); dit != fData.end(); ++dit)
00068 {
00069 const Corr::Key &key = dit -> first;
00070 const Corr::Data &data = dit -> second;
00071
00072 const double nom = data.sum_xy - data.sum_x*data.sum_y * inv_size;
00073 const double den1 = data.sum_xx - data.sum_x*data.sum_x * inv_size;
00074 const double den2 = data.sum_yy - data.sum_y*data.sum_y * inv_size;
00075
00076 if(!(den1 > 0.0) || !(den2 > 0.0))
00077 {
00078 continue;
00079 }
00080
00081 const double corr = nom/std::sqrt(den1 * den2);
00082
00083 if(!cmap.insert(Corr::CorrMap::value_type(key, corr)).second)
00084 {
00085 std::cerr << "DataCorr::GetCorrCoef() - found a duplicate key" << std::endl;
00086 }
00087 }
00088
00089 return cmap;
00090 }
00091
00092
00093 void Anp::DataCorr::Reset()
00094 {
00095 fSampleSize = 0;
00096 fData.clear();
00097 }