00001 #ifndef Impala_Core_Vector_WeibullSim_h
00002 #define Impala_Core_Vector_WeibullSim_h
00003
00004 #include "Core/Vector/VectorTem.h"
00005 #include "Basis/NativeTypes.h"
00006
00007 namespace Impala
00008 {
00009 namespace Core
00010 {
00011 namespace Vector
00012 {
00013
00014
00017 inline Real64
00018 WeibullSim(Real64 b1, Real64 g1, Real64 b2, Real64 g2)
00019 {
00020 if (g1==0 || g2==0 || b1==0 || b2==0)
00021 return 0;
00022 Real64 g = (g1>g2 ? g2/g1 : g1/g2);
00023 Real64 b = (b1>b2 ? b2/b1 : b1/b2);
00024 return g*b;
00025 }
00026
00029 template <class ElemT>
00030 inline Real64
00031 WeibullSim(const VectorTem<ElemT>& v1, const VectorTem<ElemT>& v2)
00032 {
00033 Real64 score = 0;
00034 for (int i=0 ; i<v1.Size() ; i+=2)
00035 {
00036
00037
00038
00039 Real64 b1 = v1[i];
00040 Real64 g1 = v1[i+1];
00041 Real64 b2 = v2[i];
00042 Real64 g2 = v2[i+1];
00043 if (g1!=0 && g2!=0 && b1!=0 && b2!=0)
00044 {
00045 Real64 g = (g1>g2 ? g2/g1 : g1/g2);
00046 Real64 b = (b1>b2 ? b2/b1 : b1/b2);
00047 score += g*b;
00048 }
00049 }
00050 return score / (v1.Size() / 2);
00051 }
00052
00055 template <class ElemT>
00056 class WeibullSimFtor
00057 {
00058 public:
00059
00060 Real64
00061 DoIt(const VectorTem<ElemT>& v1, const VectorTem<ElemT>& v2)
00062 {
00063 Real64 score = 0;
00064 for (int i=0 ; i<v1.Size() ; i+=2)
00065 {
00066
00067
00068
00069 Real64 b1 = v1[i];
00070 Real64 g1 = v1[i+1];
00071 Real64 b2 = v2[i];
00072 Real64 g2 = v2[i+1];
00073 if (g1!=0 && g2!=0 && b1!=0 && b2!=0)
00074 {
00075 Real64 g = (g1>g2 ? g2/g1 : g1/g2);
00076 Real64 b = (b1>b2 ? b2/b1 : b1/b2);
00077 score += g*b;
00078 }
00079 }
00080 return score;
00081
00082 }
00083 };
00084
00085 }
00086 }
00087 }
00088
00089 #endif