12     : 
PolyEstimator(1, N, dt), dim_(dim), sum_ti_(0.0), sum_ti2_(0.0) {
 
   18   sum_tixi_.resize(dim);
 
   19   for (
unsigned int i = 0; i < dim; ++i) {
 
   21     sum_tixi_.at(i) = 0.0;
 
   27     Eigen::MatrixXd Tmat(
N_, 2);
 
   28     Eigen::MatrixXd pinvTmat(2, 
N_);
 
   30     for (
unsigned int i = 0; i < 
N_; ++i) {
 
   40     pinv0_ = 
new double[
N_];
 
   41     pinv1_ = 
new double[
N_];
 
   44     c0_.assign(dim_, 0.0);
 
   45     c1_.assign(dim_, 0.0);
 
   48     for (
unsigned int i = 0; i < 
N_; ++i) {
 
   49       pinv0_[i] = pinvTmat(0, i);
 
   50       pinv1_[i] = pinvTmat(1, i);
 
   55 double LinEstimator::getEsteeme() { 
return coeff_(1); }
 
   58                                      const std::vector<double>& el,
 
   73       for (
unsigned int i = 0; i < esteem.size(); ++i) {
 
   79         sum_tixi_.at(i) += t * x;
 
  100   double den = 
N_ * sum_ti2_ - sum_ti_ * sum_ti_;
 
  104   for (
unsigned int i = 0; i < dim; ++i) {
 
  108     sum_tixi_[i] += t * x;
 
  113     esteem[i] = (
N_ * sum_tixi_[i] - sum_ti_ * sum_xi_[i]) / den;
 
  117     sum_tixi_[i] -= t_old * x;
 
  120   sum_ti2_ -= t_old * t_old;
 
  125 void LinEstimator::fit() {
 
  127   double sum_titi = 0.0;
 
  129   double sum_tixi = 0.0;
 
  131   for (
unsigned int i = 0; i < 
N_; ++i) {
 
  133     sum_titi += 
t_[i] * 
t_[i];
 
  135     sum_tixi += 
t_[i] * 
x_[i];
 
  138   double den = 
N_ * sum_titi - sum_ti * sum_ti;
 
  141   coeff_(0) = (sum_xi * sum_titi - sum_ti * sum_tixi) / den;
 
  144   coeff_(1) = (
N_ * sum_tixi - sum_ti * sum_xi) / den;
 
  150                             const std::vector<double>& el) {
 
  152     std::cerr << 
"Error: dt cannot be zero" << std::endl;
 
  154     for (
unsigned int i = 0; i < esteem.size(); ++i) esteem[i] = 0.0;
 
  163     if ((
pt_ + 1) < 
N_) {
 
  166       for (
unsigned int i = 0; i < esteem.size(); ++i) esteem[i] = el[i];
 
  178   for (
int i = 0; i < dim_; ++i) {
 
  182     for (
unsigned int j = 0; j < 
N_; ++j) {
 
  184       if (idx >= 
N_) idx -= 
N_;
 
  186       c0_[i] += x * pinv0_[j];
 
  187       c1_[i] += x * pinv1_[j];
 
  191     esteem[i] = c1_[i] * tmed_ + c0_[i];
 
  196     std::vector<double>& estimateDerivative, 
const unsigned int order) {
 
  199       for (
int i = 0; i < dim_; ++i)
 
  200         estimateDerivative[i] = c1_[i] * tmed_ + c0_[i];
 
  204       for (
int i = 0; i < dim_; ++i) estimateDerivative[i] = c1_[i];
 
  208       for (
int i = 0; i < dim_; ++i) estimateDerivative[i] = 0.0;
 
LinEstimator(const unsigned int &N, const unsigned int &dim, const double &dt=0.0)
 
virtual void estimateRecursive(std::vector< double > &estimee, const std::vector< double > &el, const double &time)
 
void getEstimateDerivative(std::vector< double > &estimeeDerivative, const unsigned int order)
 
virtual void estimate(std::vector< double > &estimee, const std::vector< double > &el)
 
unsigned int N_
Window length.
 
std::vector< double > time_list_
Time vector corresponding to each element in elem_list_.
 
double dt_
Sampling (control) time.
 
bool dt_zero_
Indicate that dt is zero (dt is invalid)
 
Eigen::VectorXd coeff_
Coefficients for the least squares solution.
 
unsigned int pt_
Circular index to each data and time element.
 
std::vector< double > t_
Time vector setting the lowest time to zero (for numerical stability).
 
std::vector< std::vector< double > > elem_list_
All the data (N elements of size dim)
 
void pinv(const Eigen::MatrixXd &matrix_in, Eigen::MatrixXd &pseudo_inv, const double &pinvtoler=1.0e-6)