00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #ifndef MLN_FUN_STAT_MAHALANOBIS_HH
00027 # define MLN_FUN_STAT_MAHALANOBIS_HH
00028
00032
00033 # include <cmath>
00034 # include <mln/core/concept/function.hh>
00035 # include <mln/algebra/vec.hh>
00036 # include <mln/algebra/mat.hh>
00037
00038
00039 namespace mln
00040 {
00041
00042 namespace fun
00043 {
00044
00045 namespace stat
00046 {
00047
00048 template <typename V>
00049 struct mahalanobis
00050 : public Function_v2v< mahalanobis<V> >,
00051 private metal::equal< V, algebra::vec<V::dim,float> >::check_t
00052 {
00053 enum { n = V::dim };
00054 typedef float result;
00055
00056 mahalanobis(const algebra::mat<n,n,float>& var,
00057 const algebra::vec<n,float>& mean);
00058
00059
00060 float operator()(const V& v) const;
00061
00062 typedef algebra::vec<n,float> mean_t;
00063
00064 mean_t mean() const;
00065
00066 protected:
00067 algebra::mat<n,n,float> var_1_;
00068 algebra::vec<n,float> mean_;
00069 };
00070
00071
00072 # ifndef MLN_INCLUDE_ONLY
00073
00074 template <typename V>
00075 inline
00076 mahalanobis<V>::mahalanobis(const algebra::mat<n,n,float>& var,
00077 const algebra::vec<n,float>& mean)
00078 {
00079 var_1_ = var._1();
00080 mean_ = mean;
00081 }
00082
00083 template <typename V>
00084 inline
00085 float
00086 mahalanobis<V>::operator()(const V& v) const
00087 {
00088 return std::sqrt((v - mean_).t() * var_1_ * (v - mean_));
00089 }
00090
00091 template <typename V>
00092 inline
00093 typename mahalanobis<V>::mean_t
00094 mahalanobis<V>::mean() const
00095 {
00096 return mean_;
00097 }
00098
00099 # endif // ! MLN_INCLUDE_ONLY
00100
00101 }
00102
00103 }
00104
00105 }
00106
00107
00108 #endif // ! MLN_FUN_STAT_MAHALANOBIS_HH