27 #ifndef MLN_NORM_L1_HH
28 # define MLN_NORM_L1_HH
35 # include <mln/math/abs.hh>
36 # include <mln/algebra/vec.hh>
49 template <
unsigned n,
typename C>
50 mln_sum_product(C,C)
l1(const C (&vec)[n]);
52 template <
unsigned n, typename C>
53 mln_sum_product(C,C)
l1(const algebra::vec<n,C>& vec);
60 template <
unsigned n, typename C>
61 mln_sum_product(C,C)
l1_distance(const C (&vec1)[n], const C (&vec2)[n]);
63 template <
unsigned n, typename C>
64 mln_sum_product(C,C)
l1_distance(const algebra::vec<n,C>& vec1,
65 const algebra::vec<n,C>& vec2);
69 # ifndef MLN_INCLUDE_ONLY
73 template <
unsigned n,
typename C,
typename V>
78 typedef mln_sum_product(C,C) M;
80 for (
unsigned i = 0; i < n; ++i)
83 m =
static_cast<M
>(m + v_i);
88 template <
unsigned n,
typename C,
typename V>
91 l1_distance_(const V& vec1, const V& vec2)
93 typedef mln_sum_product(C,C) D;
95 for (
unsigned i = 0; i < n; ++i)
98 d =
static_cast<D
>(d + v1_v2);
110 template <
unsigned n,
typename C>
113 l1(const C (&vec)[n])
115 return impl::l1_<n, C>(vec);
118 template <
unsigned n,
typename C>
121 l1(const algebra::vec<n,C>& vec)
123 return impl::l1_<n, C>(vec);
126 template <
unsigned n,
typename C>
129 l1_distance(const C (&vec1)[n], const C (&vec2)[n])
131 return impl::l1_distance_<n, C>(vec1, vec2);
134 template <
unsigned n,
typename C>
137 l1_distance(const algebra::vec<n,C>& vec1, const algebra::vec<n,C>& vec2)
139 return impl::l1_distance_<n, C>(vec1, vec2);
142 # endif // ! MLN_INCLUDE_ONLY
149 #endif // ! MLN_NORM_L1_HH