27 #ifndef MLN_NORM_L2_HH
28 # define MLN_NORM_L2_HH
36 # include <mln/math/sqr.hh>
37 # include <mln/math/sqrt.hh>
38 # include <mln/algebra/vec.hh>
39 # include <mln/value/ops.hh>
48 template <
unsigned n,
typename T>
class vec;
59 template <
unsigned n,
typename C>
60 mln_sum_product(C,C)
l2(const C (&vec)[n]);
62 template <
unsigned n, typename C>
63 mln_sum_product(C,C)
l2(const algebra::vec<n,C>& vec);
70 template <
unsigned n, typename C>
71 mln_sum_product(C,C)
sqr_l2(const C (&vec)[n]);
73 template <
unsigned n, typename C>
74 mln_sum_product(C,C)
sqr_l2(const algebra::vec<n,C>& vec);
81 template <
unsigned n, typename C>
82 mln_sum_product(C,C)
l2_distance(const C (&vec1)[n], const C (&vec2)[n]);
84 template <
unsigned n, typename C>
85 mln_sum_product(C,C)
l2_distance(const algebra::vec<n,C>& vec1,
86 const algebra::vec<n,C>& vec2);
90 # ifndef MLN_INCLUDE_ONLY
95 template <
unsigned n,
typename C,
typename V>
100 typedef mln_sum_product(C,C) M;
102 for (
unsigned i = 0; i < n; ++i)
105 m =
static_cast<M
>(m + sqr_v_i);
110 template <
unsigned n,
typename C,
typename V>
113 sqr_l2_(const V& vec)
115 mln_sum_product(C,C) m = 0;
116 for (
unsigned i = 0; i < n; ++i)
117 m += mln::math::
sqr(vec[i]);
121 template <
unsigned n, typename C, typename V>
124 l2_distance_(const V& vec1, const V& vec2)
126 typedef mln_sum_product(C,C) D;
128 for (
unsigned i = 0; i < n; ++i)
131 d =
static_cast<D
>(d + sqr_v1_v2);
143 template <
unsigned n,
typename C>
146 l2(const C (&vec)[n])
148 return impl::l2_<n, C>(vec);
151 template <
unsigned n,
typename C>
154 l2(const algebra::vec<n,C>& vec)
156 return impl::l2_<n, C>(vec);
160 template <
unsigned n,
typename C>
165 return impl::sqr_l2_<n, C>(vec);
168 template <
unsigned n,
typename C>
171 sqr_l2(const algebra::vec<n,C>& vec)
173 return impl::sqr_l2_<n, C>(vec);
177 template <
unsigned n,
typename C>
180 l2_distance(const C (&vec1)[n], const C (&vec2)[n])
182 return impl::l2_distance_<n, C>(vec1, vec2);
185 template <
unsigned n,
typename C>
188 l2_distance(const algebra::vec<n,C>& vec1, const algebra::vec<n,C>& vec2)
190 return impl::l2_distance_<n, C>(vec1, vec2);
193 # endif // ! MLN_INCLUDE_ONLY
200 #endif // ! MLN_NORM_L2_HH