00001
00002
00003 #ifndef VQ_H
00004 #define VQ_H
00005
00006
00007 #include "Object.h"
00008 #include <vector>
00009
00010 namespace FD {
00011
00013 class VQ : public Object {
00014 protected:
00015 float (*dist)(const float *, const float*, int);
00016 int length;
00017 public:
00018 static float euclidian (const float *x, const float *y, int len)
00019 {
00020 float sum1=0,sum2=0,sum3=0,sum4=0;
00021 const float *end = x+len;
00022 while (x<end-3)
00023 {
00024 sum1 += (*x-*y)*(*x-*y);
00025 x++; y++;
00026 sum2 += (*x-*y)*(*x-*y);
00027 x++; y++;
00028 sum3 += (*x-*y)*(*x-*y);
00029 x++; y++;
00030 sum4 += (*x-*y)*(*x-*y);
00031 x++; y++;
00032 }
00033 while (x<end)
00034 {
00035 sum1 += (*x-*y)*(*x-*y);
00036 x++; y++;
00037 }
00038 return (sum1+sum2)+(sum3+sum4);
00039 }
00040
00041 public:
00042 VQ(float (*_dist)(const float *, const float*, int) = euclidian)
00043 : dist(_dist)
00044 {}
00045
00046 virtual ~VQ() {}
00047
00048 virtual int nbClasses() const = 0;
00049
00050
00051
00052 virtual int getClassID (const float *v, float *dist_return = NULL) const = 0;
00053
00054
00055
00056 virtual void printOn(std::ostream &out=std::cout) const = 0;
00057 virtual void readFrom (std::istream &in=std::cin) = 0;
00058 };
00059
00060 }
00061
00062 #endif