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_NORM_L1_HH
00027 # define MLN_NORM_L1_HH
00028
00033
00034 # include <mln/math/abs.hh>
00035 # include <mln/algebra/vec.hh>
00036
00037
00038 namespace mln
00039 {
00040
00041 namespace norm
00042 {
00043
00046 template <unsigned n, typename C>
00047 mln_sum_product(C,C) l1(const C (&vec)[n]);
00048
00049 template <unsigned n, typename C>
00050 mln_sum_product(C,C) l1(const algebra::vec<n,C>& vec);
00052
00055 template <unsigned n, typename C>
00056 mln_sum_product(C,C) l1_distance(const C (&vec1)[n], const C (&vec2)[n]);
00057
00058 template <unsigned n, typename C>
00059 mln_sum_product(C,C) l1_distance(const algebra::vec<n,C>& vec1,
00060 const algebra::vec<n,C>& vec2);
00062
00063
00064 # ifndef MLN_INCLUDE_ONLY
00065
00066 namespace impl
00067 {
00068 template <unsigned n, typename C, typename V>
00069 inline
00070 mln_sum_product(C,C)
00071 l1_(const V& vec)
00072 {
00073 typedef mln_sum_product(C,C) M;
00074 M m = 0;
00075 for (unsigned i = 0; i < n; ++i)
00076 {
00077 M v_i = static_cast<M>(mln::math::abs(vec[i]));
00078 m = static_cast<M>(m + v_i);
00079 }
00080 return m;
00081 }
00082
00083 template <unsigned n, typename C, typename V>
00084 inline
00085 mln_sum_product(C,C)
00086 l1_distance_(const V& vec1, const V& vec2)
00087 {
00088 typedef mln_sum_product(C,C) D;
00089 D d = 0;
00090 for (unsigned i = 0; i < n; ++i)
00091 {
00092 D v1_v2 = static_cast<D>(mln::math::abs(vec1[i] - vec2[i]));
00093 d = static_cast<D>(d + v1_v2);
00094 }
00095 return d;
00096 }
00097
00098 }
00099
00100
00101
00102
00103
00104
00105 template <unsigned n, typename C>
00106 inline
00107 mln_sum_product(C,C)
00108 l1(const C (&vec)[n])
00109 {
00110 return impl::l1_<n, C>(vec);
00111 }
00112
00113 template <unsigned n, typename C>
00114 inline
00115 mln_sum_product(C,C)
00116 l1(const algebra::vec<n,C>& vec)
00117 {
00118 return impl::l1_<n, C>(vec);
00119 }
00120
00121 template <unsigned n, typename C>
00122 inline
00123 mln_sum_product(C,C)
00124 l1_distance(const C (&vec1)[n], const C (&vec2)[n])
00125 {
00126 return impl::l1_distance_<n, C>(vec1, vec2);
00127 }
00128
00129 template <unsigned n, typename C>
00130 inline
00131 mln_sum_product(C,C)
00132 l1_distance(const algebra::vec<n,C>& vec1, const algebra::vec<n,C>& vec2)
00133 {
00134 return impl::l1_distance_<n, C>(vec1, vec2);
00135 }
00136
00137 # endif // ! MLN_INCLUDE_ONLY
00138
00139 }
00140
00141 }
00142
00143
00144 #endif // ! MLN_NORM_L1_HH