26 auto relativeTime = [tsMin =
_tsMin, tsMax =
_tsMax](
double t) ->
double {
return (t - tsMin) / (tsMax - tsMin); };
27 ts =
ts.unaryExpr(relativeTime);
33 Eigen::KnotAveraging(
ts, splineDegree,
_knots);
37 Eigen::DenseIndex n = xs.cols();
39 matrixEntries.
reserve(2 + (n - 2) * (splineDegree + 1));
42 for (Eigen::DenseIndex i = 1; i < n - 1; ++i) {
43 const Eigen::DenseIndex
span = Eigen::Spline<double, 1>::Span(
ts[i], splineDegree,
_knots);
44 auto basisFunc = Eigen::Spline<double, 1>::BasisFunctions(
ts[i], splineDegree,
_knots);
46 for (Eigen::DenseIndex j = 0; j < splineDegree + 1; ++j) {
53 Eigen::SparseMatrix<double> A(n, n);
54 A.setFromTriplets(matrixEntries.
begin(), matrixEntries.
end());
57 Eigen::SparseQR<Eigen::SparseMatrix<double>, Eigen::COLAMDOrdering<int>> qr;
61 _ctrls = qr.solve(xs.transpose());
Bspline(Eigen::VectorXd ts, const Eigen::MatrixXd &xs, int splineDegree)
Initialises the B-Spline interpolation with the given data (x0,t0), (x1,t1), ..., (xn,...