26 #ifndef MLN_NORM_L1_HH
27 # define MLN_NORM_L1_HH
34 # include <mln/math/abs.hh>
35 # include <mln/algebra/vec.hh>
46 template <
unsigned n,
typename C>
47 mln_sum_product(C,C)
l1(const C (&vec)[n]);
49 template <
unsigned n, typename C>
50 mln_sum_product(C,C)
l1(const algebra::vec<n,C>& vec);
55 template <
unsigned n, typename C>
56 mln_sum_product(C,C)
l1_distance(const C (&vec1)[n], const C (&vec2)[n]);
58 template <
unsigned n, typename C>
59 mln_sum_product(C,C)
l1_distance(const algebra::vec<n,C>& vec1,
60 const algebra::vec<n,C>& vec2);
64 # ifndef MLN_INCLUDE_ONLY
68 template <
unsigned n,
typename C,
typename V>
73 typedef mln_sum_product(C,C) M;
75 for (
unsigned i = 0; i < n; ++i)
78 m =
static_cast<M
>(m + v_i);
83 template <
unsigned n,
typename C,
typename V>
86 l1_distance_(const V& vec1, const V& vec2)
88 typedef mln_sum_product(C,C) D;
90 for (
unsigned i = 0; i < n; ++i)
93 d =
static_cast<D
>(d + v1_v2);
105 template <
unsigned n,
typename C>
108 l1(const C (&vec)[n])
110 return impl::l1_<n, C>(vec);
113 template <
unsigned n,
typename C>
116 l1(const algebra::vec<n,C>& vec)
118 return impl::l1_<n, C>(vec);
121 template <
unsigned n,
typename C>
126 return impl::l1_distance_<n, C>(vec1, vec2);
129 template <
unsigned n,
typename C>
132 l1_distance(const algebra::vec<n,C>& vec1, const algebra::vec<n,C>& vec2)
134 return impl::l1_distance_<n, C>(vec1, vec2);
137 # endif // ! MLN_INCLUDE_ONLY
144 #endif // ! MLN_NORM_L1_HH