Main Page | Namespace List | Class Hierarchy | Class List | Directories | File List | Namespace Members | Class Members

covariance.h

00001 // Copyright (C) 1998-1999  Jean-Marc Valin
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 }//namespace FD
00190 
00191 #endif

Generated on Wed Oct 5 14:28:55 2005 for FlowDesigner by  doxygen 1.4.4