/
eigenSpline.cpp
71 lines (60 loc) · 1.53 KB
/
eigenSpline.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include <cmath>
#include <iostream>
#include <algorithm>
#include <cassert>
#include <fstream>
#include <Eigen/Core>
#include <unsupported/Eigen/Splines>
// define helpers to scale X values down to [0, 1]
struct scaledValue
{
scaledValue(double const xMin,double const xMax)
:mXMin(xMin),mXMax(xMax)
{
assert(mXMax > mXMin);
}
const double operator()(double const x) const
{
return (x - mXMin) / (mXMax - mXMin);
}
double mXMin,mXMax;
};
Eigen::RowVectorXd scaledValues(Eigen::VectorXd const& x)
{
return x.unaryExpr(scaledValue(x.minCoeff(),x.maxCoeff())).transpose();
}
void testSine()
{
typedef Eigen::Spline<double,1> Spline1d;
// create data
const size_t numData = 1000;
Eigen::VectorXd x(numData);
Eigen::VectorXd y(numData);
const double a = 0;
const double b = 4*M_PI;
const double dx = (b-a)/double(numData);
for(size_t i=0;i<numData;++i)
{
x(i) = a + i*dx;
y(i) = std::sin(x(i));
}
// create a spline
Spline1d spline(
Eigen::SplineFitting<Spline1d>::Interpolate(y.transpose(),
std::min<int>(x.rows() - 1, 3),scaledValues(x))
);
std::ofstream outFile;
outFile.open("eigenSplinePlot.dat",std::ios::trunc);
for(size_t i=0;i<numData;++i)
{
double xiSc = scaledValue(x.minCoeff(),x.maxCoeff())(x(i));
double yiSpl = spline(xiSc)(0);
outFile<<x(i)<<"\t"<<y(i)<<"\t"<<yiSpl<<std::endl;
}
outFile.close();
}
int main(void)
{
testSine();
return 0;
}