Chris@49: // Copyright (C) 2009-2011 NICTA (www.nicta.com.au) Chris@49: // Copyright (C) 2009-2011 Conrad Sanderson Chris@49: // Chris@49: // This Source Code Form is subject to the terms of the Mozilla Public Chris@49: // License, v. 2.0. If a copy of the MPL was not distributed with this Chris@49: // file, You can obtain one at http://mozilla.org/MPL/2.0/. Chris@49: Chris@49: Chris@49: //! \addtogroup running_stat_vec Chris@49: //! @{ Chris@49: Chris@49: Chris@49: Chris@49: //! Class for keeping statistics of a continuously sampled process / signal. Chris@49: //! Useful if the storage of individual samples is not necessary or desired. Chris@49: //! Also useful if the number of samples is not known beforehand or exceeds Chris@49: //! available memory. Chris@49: template Chris@49: class running_stat_vec Chris@49: { Chris@49: public: Chris@49: Chris@49: typedef typename get_pod_type::result T; Chris@49: Chris@49: inline ~running_stat_vec(); Chris@49: inline running_stat_vec(const bool in_calc_cov = false); Chris@49: Chris@49: inline running_stat_vec(const running_stat_vec& in_rsv); Chris@49: Chris@49: inline const running_stat_vec& operator=(const running_stat_vec& in_rsv); Chris@49: Chris@49: template arma_hot inline void operator() (const Base< T, T1>& X); Chris@49: template arma_hot inline void operator() (const Base< std::complex, T1>& X); Chris@49: Chris@49: inline void reset(); Chris@49: Chris@49: inline const Mat& mean() const; Chris@49: Chris@49: inline const Mat< T>& var (const uword norm_type = 0); Chris@49: inline Mat< T> stddev(const uword norm_type = 0) const; Chris@49: inline const Mat& cov (const uword norm_type = 0); Chris@49: Chris@49: inline const Mat& min() const; Chris@49: inline const Mat& max() const; Chris@49: Chris@49: inline T count() const; Chris@49: Chris@49: // Chris@49: // Chris@49: Chris@49: private: Chris@49: Chris@49: const bool calc_cov; Chris@49: Chris@49: arma_aligned arma_counter counter; Chris@49: Chris@49: arma_aligned Mat r_mean; Chris@49: arma_aligned Mat< T> r_var; Chris@49: arma_aligned Mat r_cov; Chris@49: Chris@49: arma_aligned Mat min_val; Chris@49: arma_aligned Mat max_val; Chris@49: Chris@49: arma_aligned Mat< T> min_val_norm; Chris@49: arma_aligned Mat< T> max_val_norm; Chris@49: Chris@49: arma_aligned Mat< T> r_var_dummy; Chris@49: arma_aligned Mat r_cov_dummy; Chris@49: Chris@49: arma_aligned Mat tmp1; Chris@49: arma_aligned Mat tmp2; Chris@49: Chris@49: friend class running_stat_vec_aux; Chris@49: }; Chris@49: Chris@49: Chris@49: Chris@49: class running_stat_vec_aux Chris@49: { Chris@49: public: Chris@49: Chris@49: template Chris@49: inline static void update_stats(running_stat_vec< eT >& x, const Mat& sample); Chris@49: Chris@49: template Chris@49: inline static void update_stats(running_stat_vec< std::complex >& x, const Mat< T>& sample); Chris@49: Chris@49: template Chris@49: inline static void update_stats(running_stat_vec< std::complex >& x, const Mat< std::complex >& sample); Chris@49: Chris@49: // Chris@49: Chris@49: template Chris@49: inline static Mat var(const running_stat_vec< eT >& x, const uword norm_type = 0); Chris@49: Chris@49: template Chris@49: inline static Mat< T> var(const running_stat_vec< std::complex >& x, const uword norm_type = 0); Chris@49: Chris@49: // Chris@49: Chris@49: template Chris@49: inline static Mat< eT > cov(const running_stat_vec< eT >& x, const uword norm_type = 0); Chris@49: Chris@49: template Chris@49: inline static Mat< std::complex > cov(const running_stat_vec< std::complex >& x, const uword norm_type = 0); Chris@49: }; Chris@49: Chris@49: Chris@49: Chris@49: //! @}