23   sum_tixi_.resize(dim);
 
   24   sum_ti2xi_.resize(dim);
 
   25   for (
unsigned int i = 0; i < dim; ++i) {
 
   27     sum_tixi_.at(i) = 0.0;
 
   28     sum_ti2xi_.at(i) = 0.0;
 
   34     Eigen::MatrixXd Tmat(
N_, 3);
 
   35     Eigen::MatrixXd pinvTmat(3, 
N_);
 
   37     for (
unsigned int i = 0; i < 
N_; ++i) {
 
   38       Tmat(i, 2) = 0.5 * time * time;
 
   48     pinv0_ = 
new double[
N_];
 
   49     pinv1_ = 
new double[
N_];
 
   50     pinv2_ = 
new double[
N_];
 
   54     c0_.assign(dim_, 0.0);
 
   55     c1_.assign(dim_, 0.0);
 
   56     c2_.assign(dim_, 0.0);
 
   59     for (
unsigned int i = 0; i < 
N_; ++i) {
 
   60       pinv2_[i] = pinvTmat(2, i);
 
   61       pinv1_[i] = pinvTmat(1, i);
 
   62       pinv0_[i] = pinvTmat(0, i);
 
   67 double QuadEstimator::getEsteeme() { 
return coeff_(2); }
 
   70                                       const std::vector<double>& el,
 
   85       sum_ti3_ += t * t * t;
 
   86       sum_ti4_ += t * t * t * t;
 
   88       for (
unsigned int i = 0; i < esteem.size(); ++i) {
 
   94         sum_tixi_.at(i) += t * x;
 
   95         sum_ti2xi_.at(i) += t * t * x;
 
  116   sum_ti3_ += t * t * t;
 
  117   sum_ti4_ += t * t * t * t;
 
  120       0.25 * 
N_ * sum_ti3_ * sum_ti3_ - 0.5 * sum_ti3_ * sum_ti2_ * sum_ti_ +
 
  121       0.25 * sum_ti2_ * sum_ti2_ * sum_ti2_ +
 
  122       0.25 * sum_ti4_ * sum_ti_ * sum_ti_ - 0.25 * 
N_ * sum_ti4_ * sum_ti2_;
 
  123   double den2 = 1.0 / (2.0 * den);
 
  130   for (
unsigned int i = 0; i < dim; ++i) {
 
  134     sum_tixi_[i] += t * x;
 
  135     sum_ti2xi_[i] += t * t * x;
 
  137     a = den2 * (sum_ti2xi_[i] * (sum_ti_ * sum_ti_ - 
N_ * sum_ti2_) +
 
  138                 sum_tixi_[i] * (
N_ * sum_ti3_ - sum_ti2_ * sum_ti_) +
 
  139                 sum_xi_[i] * (sum_ti2_ * sum_ti2_ - sum_ti3_ * sum_ti_));
 
  151     sum_tixi_[i] -= t_old * x;
 
  152     sum_ti2xi_[i] -= t_old * t_old * x;
 
  155   sum_ti2_ -= t_old * t_old;
 
  156   sum_ti3_ -= t_old * t_old * t_old;
 
  157   sum_ti4_ -= t_old * t_old * t_old * t_old;
 
  162 void QuadEstimator::fit() {
 
  164   double sum_ti2 = 0.0;
 
  165   double sum_ti3 = 0.0;
 
  166   double sum_ti4 = 0.0;
 
  168   double sum_tixi = 0.0;
 
  169   double sum_ti2xi = 0.0;
 
  171   for (
unsigned int i = 0; i < 
N_; ++i) {
 
  173     sum_ti2 += 
t_[i] * 
t_[i];
 
  174     sum_ti3 += 
t_[i] * 
t_[i] * 
t_[i];
 
  175     sum_ti4 += 
t_[i] * 
t_[i] * 
t_[i] * 
t_[i];
 
  177     sum_tixi += 
t_[i] * 
x_[i];
 
  178     sum_ti2xi += 
t_[i] * 
t_[i] * 
x_[i];
 
  181   double den = 0.25 * 
N_ * sum_ti3 * sum_ti3 -
 
  182                0.5 * sum_ti3 * sum_ti2 * sum_ti +
 
  183                0.25 * sum_ti2 * sum_ti2 * sum_ti2 +
 
  184                0.25 * sum_ti4 * sum_ti * sum_ti - 0.25 * 
N_ * sum_ti4 * sum_ti2;
 
  185   double den4 = 1.0 / (4.0 * den);
 
  187   coeff_(2) = den4 * (sum_ti2xi * (sum_ti * sum_ti - 
N_ * sum_ti2) +
 
  188                       sum_tixi * (
N_ * sum_ti3 - sum_ti2 * sum_ti) +
 
  189                       sum_xi * (sum_ti2 * sum_ti2 - sum_ti3 * sum_ti));
 
  190   coeff_(1) = den4 * (sum_ti2xi * (
N_ * sum_ti3 - sum_ti2 * sum_ti) +
 
  191                       sum_tixi * (sum_ti2 * sum_ti2 - 
N_ * sum_ti4) +
 
  192                       sum_xi * (sum_ti4 * sum_ti - sum_ti3 * sum_ti2));
 
  200                              const std::vector<double>& el) {
 
  202     std::cerr << 
"Error: dt cannot be zero" << std::endl;
 
  204     for (
unsigned int i = 0; i < esteem.size(); ++i) esteem[i] = 0.0;
 
  213     if ((
pt_ + 1) < 
N_) {
 
  216       for (
unsigned int i = 0; i < esteem.size(); ++i) esteem[i] = el[i];
 
  229   for (
int i = 0; i < dim_; ++i) {
 
  234     for (
unsigned int j = 0; j < 
N_; ++j) {
 
  236       if (idx >= 
N_) idx -= 
N_;
 
  238       c0_[i] += x * pinv0_[j];
 
  239       c1_[i] += x * pinv1_[j];
 
  240       c2_[i] += x * pinv2_[j];
 
  244     esteem[i] = 0.5 * c2_[i] * tmed_ * tmed_ + c1_[i] * tmed_ + c0_[i];
 
  249     std::vector<double>& estimateDerivative, 
const unsigned int order) {
 
  252       for (
int i = 0; i < dim_; ++i)
 
  253         estimateDerivative[i] =
 
  254             0.5 * c2_[i] * tmed_ * tmed_ + c1_[i] * tmed_ + c0_[i];
 
  258       for (
int i = 0; i < dim_; ++i)
 
  259         estimateDerivative[i] = c2_[i] * tmed_ + c1_[i];
 
  263       for (
int i = 0; i < dim_; ++i) estimateDerivative[i] = c2_[i];
 
  267       for (
int i = 0; i < dim_; ++i) estimateDerivative[i] = 0.0;
 
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)
 
virtual void estimateRecursive(std::vector< double > &estimee, const std::vector< double > &el, const double &time)
 
virtual void getEstimateDerivative(std::vector< double > &estimeeDerivative, const unsigned int order)
 
QuadEstimator(const unsigned int &N, const unsigned int &dim, const double &dt=0.0)
 
virtual void estimate(std::vector< double > &estimee, const std::vector< double > &el)
 
void pinv(const Eigen::MatrixXd &matrix_in, Eigen::MatrixXd &pseudo_inv, const double &pinvtoler=1.0e-6)