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