Helios++
Helios software for LiDAR simulations
MarquardtFitter.h
1 #pragma once
2 
3 #include <string>
4 #include <vector>
5 
10  // *** ATTRIBUTES *** //
11  // ******************** //
12  /*
13  * for solving non-linear least squares fit of f(x:A) = z with sets of x,z data points.
14  */
18  std::vector<std::vector<double>> X; //values
22  std::vector<double> Z; //output values
26  std::vector<double> A; //Parameter Set
27 
31  size_t alphaPrimeN = 0;
35  std::vector<std::vector<double>>& ALPHA_PRIME;
39  std::vector<std::vector<double>> DERIVATIVES;
43  std::vector<double> BETA;
47  std::vector<double> LAMBDA;
51  std::vector<double> ERR;
52 
53  //double DELTA = 0.000001; //used for calculating derivatives
57  double DELTA = 1e-6;
62  double MINERROR = 1e-9; //for evaluating
67  double MINCHANGE = 1e-3; //minimumchanges
68 
69 
70 public:
71  // *** CONSTRUCTION / DESTRUCTION *** //
72  // ************************************ //
79  explicit MarquardtFitter(std::vector<std::vector<double>>& apMatrix)
80  : ALPHA_PRIME(apMatrix){}
81 
82  // *** GETTERS and SETTERS *** //
83  // ***************************** //
89  void setData(const std::vector<double> & zvalues);
94  std::vector<double> getParameters();
99  void setParameters(const std::vector<double> & parameters);
108  std::vector<std::vector<double>> getMatrix(
109  std::vector<std::vector<double>> & A,
110  std::vector<int> & r,
111  int j0,
112  int j1
113  );
114 
115  // *** M E T H O D S *** //
116  // *********************** //
124  double evaluate(const std::vector<double> & values, const std::vector<double> & params);
129  double calculateErrors();
145  double calculateDerivative(int k, std::vector<double> & values, std::vector<double> & params);
159  double x,
160  double c,
161  double d,
162  double coefficient,
163  std::vector<double>& dvec
164  );
169  void calculateDerivatives();
179  void createBetaMatrix();
183  void createAlphaPrimeMatrix();
188  void iterateValues();
192  void initializeWorkspace();
196  void fitData();
205  void updateLambda(double value);
212  std::string printMatrix();
218  std::string printMatrix(std::vector<std::vector<double>> & matrix);
219 };
MarquardtFitter(std::vector< std::vector< double >> &apMatrix)
Base constructor for MarquardtFitter.
Definition: MarquardtFitter.h:79
std::vector< double > getParameters()
Obtain marquardt fitter current arguments/parameters.
Definition: MarquardtFitter.cpp:347
double calculateDerivative(int k, std::vector< double > &values, std::vector< double > &params)
Given a set of parameters, and inputs, calculates the derivative of the k&#39;th parameter.
Definition: MarquardtFitter.cpp:48
void calculateDerivatives()
Compute matrix of partial derivatives.
Definition: MarquardtFitter.cpp:88
void setData(const std::vector< double > &zvalues)
Set the values of the original data points that are going to be fit.
Definition: MarquardtFitter.cpp:23
void createBetaMatrix()
Create the beta matrix.
Definition: MarquardtFitter.cpp:111
void setParameters(const std::vector< double > &parameters)
Set the arguments/parameters for the fitter.
Definition: MarquardtFitter.cpp:32
void fitData()
Iterate until fitting is finished.
Definition: MarquardtFitter.cpp:292
double MINERROR
Mnimum error for evaluating. It is no longer used and it might be removed in the future.
Definition: MarquardtFitter.h:62
std::vector< std::vector< double > > X
X input vector.
Definition: MarquardtFitter.h:18
std::vector< std::vector< double > > DERIVATIVES
Vector containing derivatives (jacobian vector)
Definition: MarquardtFitter.h:39
double DELTA
Delta for numerical derivatives.
Definition: MarquardtFitter.h:57
std::vector< double > A
A arguments vector.
Definition: MarquardtFitter.h:26
void calculateDerivativeFast(double x, double c, double d, double coefficient, std::vector< double > &dvec)
Alternative method for faster derivative computation.
Definition: MarquardtFitter.cpp:67
double evaluate(const std::vector< double > &values, const std::vector< double > &params)
Evaluate the marquardt fitter.
Definition: MarquardtFitter.cpp:11
void initializeWorkspace()
Initializes the workspace for the Marquardt fitter.
Definition: MarquardtFitter.cpp:283
double MINCHANGE
Minimum change. It is no longer used and it might be removed in the future.
Definition: MarquardtFitter.h:67
std::vector< double > BETA
Beta vector.
Definition: MarquardtFitter.h:43
double calculateErrors()
Compute the cumulative error for current values.
Definition: MarquardtFitter.cpp:38
std::vector< std::vector< double > > & ALPHA_PRIME
Reference to alpha prime vector.
Definition: MarquardtFitter.h:35
void calculateDerivativesFast()
Alternative method for faster computation of partial derivatives matrix.
Definition: MarquardtFitter.cpp:97
std::vector< double > Z
Z output vecctor.
Definition: MarquardtFitter.h:22
std::vector< double > ERR
Error vector.
Definition: MarquardtFitter.h:51
size_t alphaPrimeN
Alpha prime vector dimensionality.
Definition: MarquardtFitter.h:31
void createAlphaPrimeMatrix()
Create the alpha prime matrix.
Definition: MarquardtFitter.cpp:120
void iterateValues()
Iterate over values considering the current error and arguments/parameters and compute the changes...
Definition: MarquardtFitter.cpp:146
Class to compute Marquardt fitter.
Definition: MarquardtFitter.h:9
std::string printMatrix()
Build a string representing the alpha prime matrix together with beta vector for debugging purposes...
Definition: MarquardtFitter.cpp:354
void updateLambda(double value)
Update lambda.
Definition: MarquardtFitter.cpp:332
std::vector< double > LAMBDA
Lambda vector.
Definition: MarquardtFitter.h:47
std::vector< std::vector< double > > getMatrix(std::vector< std::vector< double >> &A, std::vector< int > &r, int j0, int j1)
Get a submatrix.
Definition: MarquardtFitter.cpp:264