16 template <
class T,
class VECTOR>
17 T
interpolate(
const T& x,
const VECTOR& ys,
const T& x0,
const T& x1)
22 const size_t N = ys.size();
23 if (x <= x0)
return ys[0];
24 if (x >= x1)
return ys[N - 1];
25 const T Ax = (x1 - x0) / T(N);
26 const size_t i = int((x - x0) / Ax);
27 if (i >= N - 1)
return ys[N - 1];
28 const T Ay = ys[i + 1] - ys[i];
29 return ys[i] + (x - (x0 + i * Ax)) * Ay / Ax;
33 template <
typename NUMTYPE,
class VECTORLIKE>
35 const NUMTYPE t,
const VECTORLIKE& x,
const VECTORLIKE& y,
bool wrap2pi)
38 ASSERT_(x.size() == 4 && y.size() == 4);
39 ASSERT_(x[0] <= x[1] && x[1] <= x[2] && x[2] <= x[3]);
43 for (
unsigned int i = 0; i < 3; i++) h[i] = x[i + 1] - x[i];
45 double k = 1 / (4 * h[0] * h[1] + 4 * h[0] * h[2] + 3 * h[1] * h[1] +
47 double a11 = 2 * (h[1] + h[2]) * k;
48 double a12 = -h[1] * k;
49 double a22 = 2 * (h[0] + h[1]) * k;
51 double y0, y1, y2, y3;
89 double b1 = (y2 - y1) / h[1] - (y1 - y0) / h[0];
90 double b2 = (y3 - y2) / h[2] - (y2 - y1) / h[1];
93 double z1 = 6 * (a11 *
b1 + a12 *
b2);
94 double z2 = 6 * (a12 *
b1 + a22 *
b2);
99 res = (z1 * pow((t - x[0]), 3) + z0 * pow((x[1] - t), 3)) / (6 * h[0]) +
100 (y1 / h[0] - h[0] / 6 * z1) * (t - x[0]) +
101 (y0 / h[0] - h[0] / 6 * z0) * (x[1] - t);
105 res = (z2 * pow((t - x[1]), 3) + z1 * pow((x[2] - t), 3)) /
107 (y2 / h[1] - h[1] / 6 * z2) * (t - x[1]) +
108 (y1 / h[1] - h[1] / 6 * z1) * (x[2] - t);
110 res = (z3 * pow((t - x[2]), 3) + z2 * pow((x[3] - t), 3)) /
112 (y3 / h[2] - h[2] / 6 * z3) * (t - x[2]) +
113 (y2 / h[2] - h[2] / 6 * z2) * (x[3] - t);
118 template <
typename NUMTYPE,
class VECTORLIKE,
int NUM_POINTS>
120 const NUMTYPE t,
const VECTORLIKE& x,
const VECTORLIKE& y,
bool wrap2pi)
128 const size_t N = x.size();
131 const NUMTYPE x_min = x.minCoeff();
134 for (
size_t i = 0; i < N; i++)
137 Xt(1, i) = x[i] - x_min;
141 ((Xt * Xt.transpose()).inverse().eval() * Xt * y.asEigen()).eval();
144 NUMTYPE ret = B[0] + B[1] * (t - x_min);
156 class VECTORLIKE1,
class VECTORLIKE2,
class VECTORLIKE3,
int NUM_POINTS>
158 const VECTORLIKE1& ts, VECTORLIKE2& outs,
const VECTORLIKE3& x,
159 const VECTORLIKE3& y,
bool wrap2pi)
167 const size_t N = x.size();
170 using NUM =
typename VECTORLIKE3::value_type;
171 const NUM x_min = x.minCoeff();
174 for (
size_t i = 0; i < N; i++)
177 Xt(1, i) = x[i] - x_min;
184 const auto XXt_inv_X = XXt_inv * Xt;
189 const size_t tsN = size_t(ts.size());
192 for (
size_t k = 0; k < tsN; k++)
193 outs[k] = B[0] + B[1] * (ts[k] - x_min);
195 for (
size_t k = 0; k < tsN; k++)
NUMTYPE leastSquareLinearFit(const NUMTYPE t, const VECTORLIKE &x, const VECTORLIKE &y, bool wrap2pi=false)
Interpolates or extrapolates using a least-square linear fit of the set of values "x" and "y"...
void resize(size_t row, size_t col)
T interpolate(const T &x, const VECTOR &ys, const T &x0, const T &x1)
Interpolate a data sequence "ys" ranging from "x0" to "x1" (equally spaced), to obtain the approximat...
void matProductOf_AAt(const MAT_A &A)
this = A * AT
#define ASSERT_(f)
Defines an assertion mechanism.
This base provides a set of functions for maths stuff.
void matProductOf_Ab(const CMatrixDynamic< T > &A, const CVectorDynamic< T > &b)
this = A * b , with A and b a dynamic matrix & vector
CMatrixDynamic< T > inverse_LLt() const
Returns the inverse of a symmetric matrix using LLt.
T wrapToPi(T a)
Modifies the given angle to translate it into the ]-pi,pi] range.
matrix_size_t size() const
Get a 2-vector with [NROWS NCOLS] (as in MATLAB command size(x))
NUMTYPE spline(const NUMTYPE t, const VECTORLIKE &x, const VECTORLIKE &y, bool wrap2pi=false)
Interpolates the value of a function in a point "t" given 4 SORTED points where "t" is between the tw...
This template class provides the basic functionality for a general 2D any-size, resizable container o...