35 #ifndef VIGRA_METRIC_HXX
36 #define VIGRA_METRIC_HXX
38 #include <vigra/numerictraits.hxx>
39 #include <vigra/multi_array.hxx>
51 T operator()(
const T & a,
const T & b)
const{
52 return opImpl(&a,&a+1,&b);
54 template<
class A,
class B>
55 T operator()(
const A & a,
const B & b)
const{
56 return opImpl(a.begin(),a.end(),b.begin());
59 template<
class ITER_A,
class ITER_B>
61 ITER_A iterA ,ITER_A endA ,ITER_B iterB
65 const T aa=
static_cast<T
>(*iterA);
66 const T bb=
static_cast<T
>(*iterB);
67 const T
sum = aa + bb;
68 const T diff = aa - bb;
69 if(sum> static_cast<T>(0.0000001))
79 class HellingerDistance{
82 T operator()(
const T & a,
const T & b)
const{
83 return opImpl(&a,&a+1,&b);
85 template<
class A,
class B>
86 T operator()(
const A & a,
const B & b)
const{
87 return opImpl(a.begin(),a.end(),b.begin());
90 template<
class ITER_A,
class ITER_B>
92 ITER_A iterA ,ITER_A endA ,ITER_B iterB
96 const T aa=
std::sqrt(static_cast<T>(*iterA));
97 const T bb=
std::sqrt(static_cast<T>(*iterB));
98 const T diff = aa - bb;
107 template<
class T,
unsigned int NORM,
bool TAKE_ROOT=true>
111 T operator()(
const T & a,
const T & b)
const{
112 return opImpl(&a,&a+1,&b);
114 template<
class A,
class B>
115 T operator()(
const A & a,
const B & b)
const{
116 return opImpl(a.begin(),a.end(),b.begin());
119 template<
class ITER_A,
class ITER_B>
121 ITER_A iterA ,ITER_A endA ,ITER_B iterB
123 T res =
static_cast<T
>(0.0);
125 const T aa=
static_cast<T
>(*iterA);
126 const T bb=
static_cast<T
>(*iterB);
127 const T diff = aa-bb;
128 res+=
std::abs(std::pow((
double)diff,(
int)NORM));
132 return TAKE_ROOT ? std::pow(res,static_cast<T>(1)/static_cast<T>(NORM)) : res;
138 :
public PNorm<T,2,false>{
141 : PNorm<T,2,false>(){
147 :
public PNorm<T,2,true>{
156 :
public PNorm<T,1,false>{
159 : PNorm<T,1,false>(){
164 class SymetricKlDivergenz{
166 SymetricKlDivergenz(){}
167 T operator()(
const T & a,
const T & b)
const{
168 return opImpl(&a,&a+1,&b);
170 template<
class A,
class B>
171 T operator()(
const A & a,
const B & b)
const{
172 return opImpl(a.begin(),a.end(),b.begin());
175 template<
class ITER_A,
class ITER_B>
177 ITER_A iterA ,ITER_A endA ,ITER_B iterB
179 T res =
static_cast<T
>(0.0);
181 const T aa=
static_cast<T
>(*iterA);
182 const T bb=
static_cast<T
>(*iterB);
183 const T val =
std::log(aa/bb)*(aa - bb);
184 if(!isinf(val) && !isnan(val))
189 return res/
static_cast<T
>(2.0);
194 class BhattacharyaDistance{
196 BhattacharyaDistance(){}
197 T operator()(
const T & a,
const T & b)
const{
198 return opImpl(&a,&a+1,&b);
200 template<
class A,
class B>
201 T operator()(
const A & a,
const B & b)
const{
202 return opImpl(a.begin(),a.end(),b.begin());
205 template<
class ITER_A,
class ITER_B>
207 ITER_A iterA ,ITER_A endA ,ITER_B iterB
209 T res =
static_cast<T
>(0.0);
211 const T aa=
static_cast<T
>(*iterA);
212 const T bb=
static_cast<T
>(*iterB);
217 return std::sqrt( static_cast<T>(1.0)-res);
236 Metric(
const MetricType metricType = ManhattanMetric)
237 : metricType_(metricType){
241 template<
class A,
class B>
242 T operator()(
const A & a,
const B & b)
const{
243 switch(static_cast<unsigned int>(metricType_)){
245 return chiSquared_(a,b);
247 return hellingerDistance_(a,b);
249 return squaredNorm_(a,b);
253 return manhattan_(a,b);
255 return symetricKlDivergenz_(a,b);
257 return bhattacharyaDistance_(a,b);
263 MetricType metricType_;
264 ChiSquared<T> chiSquared_;
265 HellingerDistance<T> hellingerDistance_;
266 SquaredNorm<T> squaredNorm_;
268 Manhattan<T> manhattan_;
269 SymetricKlDivergenz<T> symetricKlDivergenz_;
270 BhattacharyaDistance<T> bhattacharyaDistance_;
277 #endif //VIGRA_METRIC_HXX
NumericTraits< V >::Promote sum(TinyVectorBase< V, SIZE, D1, D2 > const &l)
sum of the vector's elements
Definition: tinyvector.hxx:2073
linalg::TemporaryMatrix< T > log(MultiArrayView< 2, T, C > const &v)
FFTWComplex< R >::NormType abs(const FFTWComplex< R > &a)
absolute value (= magnitude)
Definition: fftw3.hxx:1002
SquareRootTraits< FixedPoint< IntBits, FracBits > >::SquareRootResult sqrt(FixedPoint< IntBits, FracBits > v)
square root.
Definition: fixedpoint.hxx:616