00001 #ifndef theplu_yat_statistics_euclidean_distance_h
00002 #define theplu_yat_statistics_euclidean_distance_h
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include "AveragerPair.h"
00027 #include "AveragerPairWeighted.h"
00028 #include "yat/utility/iterator_traits.h"
00029
00030 #include <cmath>
00031
00032 namespace theplu {
00033 namespace yat {
00034 namespace statistics {
00035
00043 struct EuclideanDistance
00044 {
00063 template <typename ForwardIterator1, typename ForwardIterator2>
00064 double operator()(ForwardIterator1 beg1, ForwardIterator1 end1,
00065 ForwardIterator2 beg2) const
00066 {
00067 using utility::weighted_if_any2;
00068 typename weighted_if_any2<ForwardIterator1,ForwardIterator2>::type tag;
00069 return this->distance(beg1, end1, beg2, tag);
00070 }
00071
00072 private:
00073 template <typename Iter1, typename Iter2>
00074 double distance (Iter1 beg1,Iter1 end1, Iter2 beg2,
00075 utility::unweighted_iterator_tag) const
00076 {
00077 AveragerPair ap;
00078 add(ap,beg1,end1,beg2);
00079 return sqrt(ap.sum_squared_deviation());
00080 }
00081
00082 template <typename Iter1, typename Iter2>
00083 double distance (Iter1 beg1,Iter1 end1, Iter2 beg2,
00084 utility::weighted_iterator_tag) const
00085 {
00086 AveragerPairWeighted ap;
00087 add(ap,beg1,end1,beg2);
00088 return sqrt(std::distance(beg1,end1)*ap.msd());
00089 }
00090
00091 };
00092
00093 }}}
00094
00095 #endif