#include <vector>
#include <itkConceptChecking.h>
#include <itkObject.h>
-#include <vnl/vnl_matrix.h>
+#include <itkObjectFactory.h>
+
+#include <itkCovariantVector.h>
+#include <itkMatrix.h>
+#include <itkPoint.h>
+#include <itkVector.h>
namespace cpExtensions
{
namespace Algorithms
{
/**
+ * Recursive formulation taken from:
+ * http://lmb.informatik.uni-freiburg.de/lectures/mustererkennung/Englische_Folien/07_c_ME_en.pdf
*/
- template< class S, unsigned int D >
+ template< class _TScalar, unsigned int _VDimension >
class IterativeGaussianModelEstimator
: public itk::Object
{
typedef itk::SmartPointer< Self > Pointer;
typedef itk::SmartPointer< const Self > ConstPointer;
- typedef S TScalar;
- itkStaticConstMacro( Dimension, unsigned int, D );
+ typedef _TScalar TScalar;
+ itkStaticConstMacro( Dimension, unsigned int, _VDimension );
// Begin concept checking
#ifdef ITK_USE_CONCEPT_CHECKING
itkConceptMacro(
ScalarTypeHasFloatResolution,
- ( itk::Concept::IsFloatingPoint< S > )
+ ( itk::Concept::IsFloatingPoint< _TScalar > )
);
#endif
// End concept checking
- typedef vnl_matrix< S > TMatrix;
- typedef std::vector< TMatrix > TMatrices;
+ typedef itk::Matrix< TScalar, Dimension, Dimension > TMatrix;
+ typedef itk::Vector< TScalar, Dimension > TVector;
public:
itkNewMacro( Self );
itkTypeMacro( IterativeGaussianModelEstimator, itkObject );
+ itkGetConstMacro( Mean, TVector );
+ itkGetConstMacro( Covariance, TMatrix );
+ itkGetConstMacro( UnbiasedCovariance, TMatrix );
+ itkGetConstMacro( NumberOfSamples, unsigned long );
+
+ itkSetMacro( Mean, TVector );
+ itkSetMacro( Covariance, TMatrix );
+ itkSetMacro( NumberOfSamples, unsigned long );
+
public:
- unsigned long GetNumberOfSamples( ) const
- { return( ( unsigned long )( this->m_N ) ); }
- const TMatrix& GetMu( ) const
- { return( this->m_M ); }
- const TMatrix& GetOmega( ) const
- { return( this->m_O ); }
+ void Clear( );
+
+ template< class _TOtherScalar >
+ void AddSample( const _TOtherScalar& x1, ... );
- void SetNumberOfSamples( unsigned long n );
- void SetMu( const TMatrix& m );
- void SetOmega( const TMatrix& O );
+ template< class _TOtherScalar >
+ void AddSample( const _TOtherScalar* array );
- bool SaveModelToFile( const std::string& filename ) const;
- bool LoadModelFromFile( const std::string& filename );
+ template< class _TOtherScalar >
+ void AddSample( const vnl_vector< _TOtherScalar >& v );
- template< class V >
- S Probability( const V& sample ) const;
+ template< class _TOtherScalar >
+ void AddSample(
+ const itk::CovariantVector< _TOtherScalar, _VDimension >& v
+ );
- S Probability( const S& s_x, const S& s_y, ... ) const;
+ template< class _TOtherScalar >
+ void AddSample( const itk::Point< _TOtherScalar, _VDimension >& p );
- template< class V, class M >
- void GetModel( V& m, M& E ) const;
+ template< class _TOtherScalar >
+ void AddSample( const itk::Vector< _TOtherScalar, _VDimension >& v );
- void Clear( );
+ template< class _TOtherScalar >
+ _TScalar SquaredMahalanobis( const _TOtherScalar& x1, ... ) const;
+
+ template< class _TOtherScalar >
+ _TScalar SquaredMahalanobis( const _TOtherScalar* array ) const;
+
+ template< class _TOtherScalar >
+ _TScalar SquaredMahalanobis(
+ const vnl_vector< _TOtherScalar >& v
+ ) const;
+
+ template< class _TOtherScalar >
+ _TScalar SquaredMahalanobis(
+ const itk::CovariantVector< _TOtherScalar, _VDimension >& v
+ ) const;
- template< class V >
- void AddSample( const V& sample );
+ template< class _TOtherScalar >
+ _TScalar SquaredMahalanobis(
+ const itk::Point< _TOtherScalar, _VDimension >& p
+ ) const;
- void AddSample( const S& s_x, const S& s_y, ... );
+ template< class _TOtherScalar >
+ _TScalar SquaredMahalanobis(
+ const itk::Vector< _TOtherScalar, _VDimension >& v
+ ) const;
protected:
IterativeGaussianModelEstimator( );
virtual ~IterativeGaussianModelEstimator( );
protected:
- void _UpdateModel( ) const;
+ void _AddSample( const TVector& v ) const;
+ _TScalar _SquaredMahalanobis( const TVector& v ) const;
private:
// Purposely not implemented
void operator=( const Self& other );
protected:
- S m_N;
- TMatrix m_M;
- TMatrix m_O;
-
- mutable bool m_Updated;
- mutable TMatrix m_Cov;
- mutable TMatrix m_Inv;
- mutable S m_Norm;
+ // Recursive avg/cov values
+ mutable unsigned long m_NumberOfSamples;
+ mutable TVector m_Mean;
+ mutable TMatrix m_Covariance;
+ mutable TMatrix m_UnbiasedCovariance;
+ mutable bool m_InverseUpdated;
+ mutable TMatrix m_InverseUnbiasedCovariance;
};
} // ecapseman