gtsam
Loading...
Searching...
No Matches
CardinalSplineBasis.h
Go to the documentation of this file.
1/* ----------------------------------------------------------------------------
2
3 * GTSAM Copyright 2010, Georgia Tech Research Corporation,
4 * Atlanta, Georgia 30332-0415
5 * All Rights Reserved
6 * Authors: Frank Dellaert, et al. (see THANKS for the full author list)
7
8 * See LICENSE for the license information
9
10 * -------------------------------------------------------------------------- */
11
17
18#pragma once
19
20#include <gtsam/basis/Basis.h>
22
23#include <stdexcept>
24
25namespace gtsam {
26
35class CardinalSplineBasis : public Basis<CardinalSplineBasis> {
36 public:
38 using Parameters = Vector;
39
41 static Weights CalculateWeights(size_t N, double x) {
42 return calculateWeights(N, x, 0);
43 }
44
46 static Weights CalculateWeights(size_t N, double x, double a, double b) {
47 const double scale = coordinateScale(N, a, b);
48 return calculateWeights(N, (x - a) * scale, 0);
49 }
50
52 static Weights DerivativeWeights(size_t N, double x) {
53 return calculateWeights(N, x, 1);
54 }
55
60 static Weights DerivativeWeights(size_t N, double x, double a, double b) {
61 const double scale = coordinateScale(N, a, b);
62 return scale * calculateWeights(N, (x - a) * scale, 1);
63 }
64
65 private:
67 static double coordinateScale(size_t N, double a, double b) {
68 if (a == b) {
69 throw std::invalid_argument(
70 "CardinalSplineBasis interval must have nonzero length");
71 }
72 return (static_cast<double>(N > 0 ? N - 1 : 0) +
73 kernels::IrwinHallCDF2.getLength()) /
74 (b - a);
75 }
76
78 static Weights calculateWeights(size_t N, double x, size_t derivative) {
79 if (N == 0) return Weights(0);
80 if (N == 1) {
81 Weights weights(1);
82 weights(0) = derivative == 0 ? 1.0 : 0.0;
83 return weights;
84 }
85
86 const double kernelTime = x + kernels::IrwinHallCDF2.getBeginning();
87 Weights cumulative(N);
88 for (size_t index = 0; index < N; ++index) {
89 cumulative(static_cast<Eigen::Index>(index)) =
90 kernels::IrwinHallCDF2.evaluateDerivative(
91 derivative, kernelTime - static_cast<double>(index));
92 }
93
94 Weights weights(N);
95 weights(0) = derivative == 0 ? 1.0 - cumulative(1) : -cumulative(1);
96 for (size_t index = 1; index + 1 < N; ++index) {
97 weights(static_cast<Eigen::Index>(index)) =
98 cumulative(static_cast<Eigen::Index>(index)) -
99 cumulative(static_cast<Eigen::Index>(index + 1));
100 }
101 weights(static_cast<Eigen::Index>(N - 1)) =
102 cumulative(static_cast<Eigen::Index>(N - 1));
103 return weights;
104 }
105};
106
107} // namespace gtsam
Compute an interpolating basis.
Piecewise polynomial Irwin-Hall PDF and CDF kernels.
Global functions in a separate testing namespace.
Definition chartTesting.h:28
CRTP Base class for function bases.
Definition Basis.h:90
Cubic cardinal-spline basis for scalar, vector, and manifold Basis functors.
Definition CardinalSplineBasis.h:35
static Weights DerivativeWeights(size_t N, double x, double a, double b)
Calculate first-derivative weights after mapping [a,b] onto the full spline support.
Definition CardinalSplineBasis.h:60
static Weights CalculateWeights(size_t N, double x, double a, double b)
Calculate weights after mapping [a,b] onto the full spline support.
Definition CardinalSplineBasis.h:46
static Weights DerivativeWeights(size_t N, double x)
Calculate first-derivative weights for unit-spaced control points.
Definition CardinalSplineBasis.h:52
static Weights CalculateWeights(size_t N, double x)
Calculate weights for unit-spaced control points.
Definition CardinalSplineBasis.h:41
Vector Parameters
Scalar control-point values consumed by the inherited basis functors.
Definition CardinalSplineBasis.h:38