3#include <ceres/ceres.h>
10template <
typename Model>
11typename std::enable_if<Model::DimensionsAtCompileTime == 2, Model>::type
18template <
typename _Scalar,
int NX=Eigen::Dynamic,
int NY=Eigen::Dynamic>
26 using InputType = Eigen::Matrix<Scalar,InputsAtCompileTime, 1>;
27 using ValueType = Eigen::Matrix<Scalar,ValuesAtCompileTime, 1>;
29 constexpr static std::string_view
name =
"functor";
39 template<
typename OStream>
53template <
int NP=Eigen::Dynamic,
int ND=Eigen::Dynamic>
59 using DataType = Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic>;
63 constexpr static std::string_view
name =
"model";
94 template <
typename T=InputDataType>
98 const long nx = x.size(), ny = y.size();
101 Eigen::Map<Eigen::MatrixXd> xx(xy.data(), ny, nx);
103 Eigen::Map<Eigen::MatrixXd> yy(xy.data() + xy.rows(), ny, nx);
105 for (Eigen::Index i = 0; i < ny; ++i) {
106 xx.row(i) = x.transpose();
109 for (Eigen::Index j = 0; j < nx; ++j) {
126 double lower = - std::numeric_limits<double>::infinity();
127 double upper = std::numeric_limits<double>::infinity();
133 constexpr static std::string_view
name =
"gaussian1d";
135 Gaussian1D(
double amplitude=1.,
double mean=0.,
double stddev=1.);
151 constexpr static std::string_view
name =
"gaussian2d";
153 Gaussian2D(
double amplitude=1.,
double xmean=0.,
double ymean=0.,
double xstddev=1.,
double ystddev=1.,
double theta=0.);
182 constexpr static std::string_view
name =
"symmetricgaussian2d";
184 SymmetricGaussian2D(
double amplitude=1.,
double xmean=0.,
double ymean=0.,
double stddev=1.);
209template <
typename _Model>
211 using _Base =
typename _Model::_Base;
220 const Eigen::Map<const typename Model::InputDataType>*
xdata =
nullptr;
221 const Eigen::Map<const typename Fitter::ValueType>*
ydata =
nullptr;
222 const Eigen::Map<const typename Fitter::ValueType>*
sigma =
nullptr;
231using ceres::AutoDiffCostFunction;
232using ceres::CostFunction;
233using ceres::CauchyLoss;
237using ceres::Covariance;
240template <
typename Model>
246 template <
typename T>
248 auto cost2 = cos(p[5]) * cos(p[5]);
249 auto sint2 = sin(p[5]) * sin(p[5]);
250 auto sin2t = sin(2. * p[5]);
251 auto xstd2 = p[3] * p[3];
252 auto ystd2 = p[4] * p[4];
253 auto a = - 0.5 * ((cost2 / xstd2) + (sint2 / ystd2));
254 auto b = - 0.5 * ((sin2t / xstd2) - (sin2t / ystd2));
255 auto c = - 0.5 * ((sint2 / xstd2) + (cost2 / ystd2));
257 for (
int i=0; i < this->values(); ++i){
258 if (this->
sigma->coeffRef(i) != 0) {
260 this->
ydata->coeffRef(i) -
262 pow(this->
xdata->coeffRef(i, 0) - p[1], 2) * a +
263 (this->xdata->coeffRef(i, 0) - p[1]) * (this->xdata->coeffRef(i, 1) - p[2]) * b +
264 pow(this->
xdata->coeffRef(i, 1) - p[2], 2) * c
266 ) / this->
sigma->coeffRef(i);
271 this->
ydata->coeffRef(i) -
273 pow(this->
xdata->coeffRef(i, 0) - p[1], 2) * a +
274 (this->xdata->coeffRef(i, 0) - p[1]) * (this->xdata->coeffRef(i, 1) - p[2]) * b +
275 pow(this->
xdata->coeffRef(i, 1) - p[2], 2) * c
277 ) * this->
sigma->coeffRef(i);
284 std::shared_ptr<Problem> problem = std::make_shared<Problem>();
285 problem->AddParameterBlock(params, this->
model()->params.size());
std::enable_if< Model::DimensionsAtCompileTime==2, Model >::type create_model(const Eigen::VectorXd ¶ms)
Definition gauss_models.h:12
Definition gauss_models.h:241
std::shared_ptr< Problem > createProblem(double *params)
Definition gauss_models.h:283
bool operator()(const T *const p, T *r) const
Definition gauss_models.h:247
Definition gauss_models.h:19
int values() const
Definition gauss_models.h:35
int m_inputs
Definition gauss_models.h:45
int m_values
Definition gauss_models.h:46
friend OStream & operator<<(OStream &os, const Self &f)
Definition gauss_models.h:40
DenseFunctor(int inputs, int values)
Definition gauss_models.h:30
Eigen::Matrix< Scalar, InputsAtCompileTime, 1 > InputType
Definition gauss_models.h:26
static constexpr std::string_view name
Definition gauss_models.h:29
Eigen::Matrix< Scalar, ValuesAtCompileTime, 1 > ValueType
Definition gauss_models.h:27
_Scalar Scalar
Definition gauss_models.h:25
DenseFunctor()
Definition gauss_models.h:32
@ InputsAtCompileTime
Definition gauss_models.h:21
@ ValuesAtCompileTime
Definition gauss_models.h:22
int inputs() const
Definition gauss_models.h:34
Definition gauss_models.h:210
_Model Model
Definition gauss_models.h:212
const Model * m_model
Definition gauss_models.h:228
Fitter(const Model *model, int values)
Definition gauss_models.h:214
const Eigen::Map< const typename Fitter::ValueType > * sigma
Definition gauss_models.h:222
typename _Model::_Base _Base
Definition gauss_models.h:211
const Model * model() const
Definition gauss_models.h:218
const Eigen::Map< const typename Fitter::ValueType > * ydata
Definition gauss_models.h:221
const Eigen::Map< const typename Model::InputDataType > * xdata
Definition gauss_models.h:220
Fitter(const Model *model)
Definition gauss_models.h:216
Definition gauss_models.h:132
ValueType operator()(const InputType &p, const InputDataType &x) const
static constexpr std::string_view name
Definition gauss_models.h:133
ValueType eval(const InputType &p, const InputDataType &x) const
Definition gauss_models.cpp:12
std::vector< Parameter > param_settings
Definition gauss_models.h:143
Definition gauss_models.h:150
InputType inverseTransform(const InputType &p) const
Definition gauss_models.cpp:69
static constexpr std::string_view name
Definition gauss_models.h:151
InputType transform(const InputType &p) const
Definition gauss_models.cpp:60
ValueType eval(const InputType &p, const InputDataType &xy) const
Definition gauss_models.cpp:30
DataType operator()(const InputType &p, const InputDataBasisType &x, const InputDataBasisType &y) const
std::vector< Parameter > param_settings
Definition gauss_models.h:171
~Gaussian2D()
Definition gauss_models.h:154
Definition gauss_models.h:122
double lower
Definition gauss_models.h:126
double upper
Definition gauss_models.h:127
bool fixed
Definition gauss_models.h:124
std::string name
Definition gauss_models.h:123
bool bounded
Definition gauss_models.h:125
Definition gauss_models.h:54
Model::InputType params
Definition gauss_models.h:80
std::enable_if< ND==2, T >::type meshgrid(const InputDataBasisType &x, const InputDataBasisType &y) const
Definition gauss_models.h:95
Model(int inputs)
Definition gauss_models.h:65
static constexpr std::string_view name
Definition gauss_models.h:63
Model(const typename _Base::InputType ¶ms)
Definition gauss_models.h:68
@ DimensionsAtCompileTime
Definition gauss_models.h:56
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic > DataType
Definition gauss_models.h:59
Model::InputType inverseTransform(const typename Model::InputType &p) const
Definition gauss_models.h:118
Model::InputType transform(const typename Model::InputType &p) const
Definition gauss_models.h:115
Eigen::Matrix< double, Eigen::Dynamic, ND > InputDataType
Definition gauss_models.h:60
Eigen::Matrix< double, Eigen::Dynamic, 1 > InputDataBasisType
Definition gauss_models.h:61
Model(std::initializer_list< double > params)
Definition gauss_models.h:70
Model()
Definition gauss_models.h:78
Definition gauss_models.h:181
ValueType eval(const InputType &p, const InputDataType &xy) const
Definition gauss_models.cpp:81
~SymmetricGaussian2D()
Definition gauss_models.h:185
DataType operator()(const InputType &p, const InputDataBasisType &x, const InputDataBasisType &y) const
static constexpr std::string_view name
Definition gauss_models.h:182
std::vector< Parameter > param_settings
Definition gauss_models.h:199