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_REGISTRATION_INTERNAL_RMS_HH
00027 # define MLN_REGISTRATION_INTERNAL_RMS_HH
00028
00029 # include <mln/norm/l2.hh>
00030 # include <mln/core/site_set/p_array.hh>
00031
00032 namespace mln
00033 {
00034
00035 namespace registration
00036 {
00037
00038 namespace internal
00039 {
00040
00041 template <typename P, typename M, typename T>
00042 float rms(const p_array<P>& a1,
00043 M& map,
00044 const unsigned length,
00045 const T& q1,
00046 const T& q2);
00047
00048 # ifndef MLN_INCLUDE_ONLY
00049
00050
00051 template <typename P, typename M, typename T>
00052 float rms(const p_array<P>& a,
00053 M& map,
00054 const T& q1,
00055 const T& q2)
00056 {
00057 float f = 0.f;
00058 for (unsigned i = 0; i < a.nsites(); ++i)
00059 {
00060 algebra::vec<P::dim,float> a2f = convert::to< algebra::vec<P::dim,float> >(a[i]);
00061 algebra::vec<P::dim,float> a1f =
00062 convert::to< algebra::vec<P::dim,float> > \
00063 (map(q1(convert::to< algebra::vec<P::dim,float> >(a[i]))));
00064
00065 f += norm::l2(a1f - q2(a2f));
00066 }
00067 return f / a.nsites();
00068 }
00069
00070
00071 # endif // ! MLN_INCLUDE_ONLY
00072
00073 }
00074
00075 }
00076
00077 }
00078
00079
00080 #endif // ! MLN_REGISTRATION_INTERNAL_RMS_HH