00001
00002 #ifndef COVARIANCE_H
00003 #define COVARIANCE_H
00004
00005 #include <math.h>
00006 #include <vector>
00007 #include "Object.h"
00008 #include "ObjectParser.h"
00009 #include "misc.h"
00010 #include "Vector.h"
00011 #include "mean.h"
00012 #include <fstream>
00013
00014 namespace FD {
00015
00016 class GMM;
00017
00019 class Covariance : public Object
00020 {
00021 protected:
00022 enum Mode {accum, real, rotated, inverted};
00023
00025 int dimension;
00026
00028 mutable double determinant;
00029
00031 mutable bool determinant_is_valid;
00032
00034 int mode;
00035
00037 int accum_count;
00038 public:
00040 Covariance(int dim) : dimension(dim) , determinant(-10000) , determinant_is_valid(false), mode(accum)
00041 {
00042
00043 }
00045 Covariance(const Covariance &cov)
00046 : dimension(cov.dimension)
00047 , determinant(0)
00048 , determinant_is_valid(false)
00049 , mode (cov.mode)
00050 , accum_count(0)
00051 {}
00053 virtual ~Covariance() {}
00054
00056 virtual void accumFrame(const float *v)=0;
00057
00059 virtual void accumFrame(const std::vector<float> &v)=0;
00060
00062 unsigned int size() const { return dimension; }
00063
00065 double getDeterminant() const
00066 {
00067 if (!determinant_is_valid) compute_determinant();
00068 return determinant;
00069 }
00070
00072 virtual void compute_determinant() const =0;
00073
00075 virtual void printOn(std::ostream &out=std::cout) const = 0;
00076
00079 virtual double mahalanobisDistance(const float *x1, const double *x2) const =0;
00080
00082 virtual double& operator[](int )=0;
00083
00085 virtual double& operator()(int,int)=0;
00086
00088 virtual void reset()=0;
00089
00091 virtual Covariance * copy()=0;
00092
00094 virtual void invert()=0;
00095
00097 virtual void processMean(RCPtr<Mean> mean)=0;
00098
00099 friend class GMM;
00100 };
00101
00102
00104 class DiagonalCovariance : public Covariance {
00106 std::vector<double> data;
00107 public:
00108 DiagonalCovariance(std::istream &in)
00109 : Covariance(0)
00110 {in >> *this;}
00111
00112 DiagonalCovariance()
00113 : Covariance(0)
00114 , data(std::vector<double>(0,0.0))
00115 {}
00116
00118 DiagonalCovariance(int dim)
00119 : Covariance(dim)
00120 , data(std::vector<double>(dim,0.0))
00121 {}
00122
00124 DiagonalCovariance (const DiagonalCovariance &cov)
00125 : Covariance(cov)
00126 , data(cov.data)
00127 {}
00128
00130 double mahalanobisDistance(const float *x1, const double *x2) const;
00131
00133 double& operator[](int i) {return data[i];}
00134
00136 double& operator()(int i) {return data[i];}
00137
00139 double& operator()(int i,int) {return data[i];}
00140
00142 void compute_determinant() const;
00143
00144
00146 void accumFrame(const float *v)
00147 {
00148 for (int i=0;i<dimension;i++)
00149 data[i] += v[i]*v[i];
00150 accum_count++;
00151 }
00152
00154 void accumFrame(const std::vector<float> &v)
00155 {
00156 for (int i=0;i<dimension;i++)
00157 data[i] += v[i]*v[i];
00158 accum_count++;
00159 }
00160
00162 void reset();
00163
00165 Covariance *copy () { return new DiagonalCovariance (*this); }
00166
00168 void invert();
00169
00171 void processMean(RCPtr<Mean> mean);
00172
00174 virtual void printOn(std::ostream &out=std::cout) const;
00175
00177 void readFrom (std::istream &in=std::cin);
00178
00180 friend std::istream &operator >> (std::istream &in, DiagonalCovariance &cov);
00181 friend class GMM;
00182 }
00183 ;
00184
00186 inline Covariance *NewDiagonalCovariance(int dim) {return new DiagonalCovariance (dim);}
00187
00188 std::istream &operator >> (std::istream &in, DiagonalCovariance &cov);
00189 }
00190
00191 #endif