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_FUN_MATH_NORM_HH
00027 # define MLN_FUN_MATH_NORM_HH
00028
00029 # include <mln/fun/unary.hh>
00030 # include <mln/norm/all.hh>
00031
00032 namespace mln
00033 {
00034
00035
00036 namespace fun
00037 {
00038 namespace norm
00039 {
00040 struct l1 : unary<l1> {};
00041
00042 struct l2 : unary<l2> {};
00043
00044 struct linfty : unary<linfty> {};
00045 }
00046 }
00047
00048 namespace trait
00049 {
00050
00051 namespace next
00052 {
00053
00054 template <unsigned n, typename T>
00055 struct set_precise_unary_<mln::fun::norm::l1, mln::algebra::vec<n, T> >
00056 {
00057 typedef set_precise_unary_ ret;
00058 typedef mln::algebra::vec<n, T> argument;
00059 typedef argument& lvalue;
00060 typedef mln_sum_product(argument,argument) result;
00061
00062 static result read(const argument& x)
00063 {
00064 return mln::norm::l1(x);
00065 }
00066
00067 static void write(lvalue l, const result& x)
00068 {
00069 l = l / read(l) * x;
00070 }
00071 };
00072
00073 template <unsigned n, typename T>
00074 struct set_precise_unary_<mln::fun::norm::l2, mln::algebra::vec<n, T> >
00075 {
00076 typedef set_precise_unary_ ret;
00077 typedef mln::algebra::vec<n, T> argument;
00078 typedef argument& lvalue;
00079 typedef mln_sum_product(argument,argument) result;
00080
00081 static result read(const argument& x)
00082 {
00083 return mln::norm::l2(x);
00084 }
00085
00086 static void write(lvalue l, const result& x)
00087 {
00088 l = l / read(l) * x;
00089 }
00090 };
00091
00092 template <unsigned n, typename T>
00093 struct set_precise_unary_<mln::fun::norm::linfty, mln::algebra::vec<n, T> >
00094 {
00095 typedef set_precise_unary_ ret;
00096 typedef mln::algebra::vec<n, T> argument;
00097 typedef argument& lvalue;
00098 typedef mln_sum_product(argument,argument) result;
00099
00100 static result read(const argument& x)
00101 {
00102 return mln::norm::linfty(x);
00103 }
00104
00105 static void write(lvalue l, const result& x)
00106 {
00107 l = l / read(l) * x;
00108 }
00109 };
00110
00111 }
00112
00113 }
00114
00115 }
00116
00117 #endif