trajopt
 All Classes Namespaces Files Functions Variables Typedefs Pages
interpolation.hpp
1 #include <Eigen/Core>
2 
3 namespace util {
4 template <typename VectorT>
5 Eigen::VectorXi searchsorted(const VectorT& x, const VectorT& y) {
6  // y(i-1) <= x(out(i)) < y(i)
7  int nX = x.size();
8  int nY = y.size();
9 
10  Eigen::VectorXi out(nX);
11  int iY=0;
12  for (int iX=0; iX < nX; iX++) {
13  while (iY < nY && x[iX] > y[iY]) iY++;
14  out(iX) = iY;
15  }
16  return out;
17 }
18 
19 template <typename MatrixT, typename VectorT>
20 MatrixT interp2d(const VectorT& xNew, const VectorT& xOld, const MatrixT& yOld) {
21 
22  int nNew = xNew.size();
23  int nOld = xOld.size();
24  MatrixT yNew(nNew, yOld.cols());
25  Eigen::VectorXi new2old = searchsorted(xNew, xOld);
26  for (int iNew=0; iNew < nNew; iNew++) {
27  int iOldAbove = new2old(iNew);
28  if (iOldAbove == 0)
29  yNew.row(iNew) = yOld.row(0);
30  else if (iOldAbove == nOld)
31  yNew.row(iNew) = yOld.row(nOld-1);
32  else {
33  double t = (xNew(iNew) - xOld(iOldAbove-1)) / (xOld(iOldAbove) - xOld(iOldAbove-1));
34  yNew.row(iNew) = yOld.row(iOldAbove-1)*(1-t) + yOld.row(iOldAbove)*t;
35  }
36  }
37  return yNew;
38 }
39 }