Brief description of class still missing. More...
#include <Covariance.h>
Public Member Functions | |
void | add (double *val) |
Covariance (int n) | |
DoubleMatrix | matrix () const |
double | mean (int i) const |
void | reset () |
Ellipse | stddev2D () const |
~Covariance () |
Brief description of class still missing.
Full description of class still missing
QGpCoreTools::Covariance::Covariance | ( | int | n | ) |
void QGpCoreTools::Covariance::add | ( | double * | val | ) |
Add vector val to the covariance computation
References TRACE.
Referenced by TapePositioningSystem::Triangulator::covariance().
{ TRACE; for(int i=0; i<_n; i++) { _sums[i]+=val[i]; } int k=0; for(int i=0; i<_n; i++) { for(int j=i; j<_n; j++) { _xProducts[k++]+=val[i]*val[j]; } } _count++; }
DoubleMatrix QGpCoreTools::Covariance::matrix | ( | ) | const |
References QGpCoreTools::Matrix< T >::at(), and TRACE.
Referenced by stddev2D().
{ TRACE; DoubleMatrix cov(_n); int k=0; double c=1.0/(_count-1); double c2=c/_count; for(int i=0; i<_n; i++) { for(int j=i; j<_n; j++) { double v=_xProducts[k++]*c-_sums[i]*_sums[j]*c2; cov.at(i, j)=v; cov.at(j, i)=v; } } return cov; }
double QGpCoreTools::Covariance::mean | ( | int | i | ) | const [inline] |
Referenced by stddev2D(), and CoordReader::terminate().
{return _sums[i]/_count;}
void QGpCoreTools::Covariance::reset | ( | ) |
References TRACE.
Referenced by Covariance().
{ TRACE; for(int i=0; i<_n; i++) { _sums[i]=0.0; } for(int i=0; i<_nx; i++) { _xProducts[i]=0.0; } _count=0; }
Ellipse QGpCoreTools::Covariance::stddev2D | ( | ) | const |
References QGpCoreTools::Matrix< T >::columnAt(), QGpCoreTools::DoubleMatrix::eigenVectors(), matrix(), mean(), QGpCoreTools::Ellipse::setCenter(), QGpCoreTools::Ellipse::setMajorRadius(), QGpCoreTools::Ellipse::setMinorRadius(), QGpCoreTools::Ellipse::setOrientation(), QGpCoreTools::sqrt(), and TRACE.
Referenced by CoordReader::terminate().
{ TRACE; Ellipse res; if(_n!=2) { return res; } if(_count>1) { DoubleMatrix cov=matrix(); QVector<double> eigenValues; DoubleMatrix eigenVectors=cov.eigenVectors(eigenValues); Point2D majorAxis=eigenVectors.columnAt(0); //Point2D minorAxis=eigenVectors.columnAt(1); res.setCenter(Point2D(mean(0), mean(1))); if(eigenValues.at(0)>0.0) { res.setMajorRadius(::sqrt(eigenValues.at(0))); } else { res.setMajorRadius(0.0); } if(eigenValues.at(1)>0.0) { res.setMinorRadius(::sqrt(eigenValues.at(1))); } else { res.setMinorRadius(0.0); } res.setOrientation(Point2D().azimuthTo(majorAxis)); } else { res.setCenter(Point2D(mean(0), mean(1))); } return res; }