You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							52 lines
						
					
					
						
							1.4 KiB
						
					
					
				
			
		
		
	
	
							52 lines
						
					
					
						
							1.4 KiB
						
					
					
				| #include <iostream>
 | |
| #include <cmath>
 | |
| 
 | |
| #include <eigen3/Eigen/Dense>
 | |
| 
 | |
| #include "data.h"
 | |
| 
 | |
| Eigen::Matrix<float, MODEL_PATH_DISTANCE, POLYFIT_DEGREE> vander;
 | |
| 
 | |
| void poly_init(){
 | |
|   // Build Vandermonde matrix
 | |
|   for(int i = 0; i < MODEL_PATH_DISTANCE; i++) {
 | |
|     for(int j = 0; j < POLYFIT_DEGREE; j++) {
 | |
|       vander(i, j) = pow(i, POLYFIT_DEGREE-j-1);
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| void poly_fit(float *in_pts, float *in_stds, float *out) {
 | |
|   // References to inputs
 | |
|   Eigen::Map<Eigen::Matrix<float, MODEL_PATH_DISTANCE, 1> > pts(in_pts, MODEL_PATH_DISTANCE);
 | |
|   Eigen::Map<Eigen::Matrix<float, MODEL_PATH_DISTANCE, 1> > std(in_stds, MODEL_PATH_DISTANCE);
 | |
|   Eigen::Map<Eigen::Matrix<float, POLYFIT_DEGREE, 1> > p(out, POLYFIT_DEGREE);
 | |
| 
 | |
|   // Build Least Squares equations
 | |
|   Eigen::Matrix<float, MODEL_PATH_DISTANCE, POLYFIT_DEGREE> lhs = vander.array().colwise() / std.array();
 | |
|   Eigen::Matrix<float, MODEL_PATH_DISTANCE, 1> rhs = pts.array() / std.array();
 | |
| 
 | |
|   Eigen::Matrix<float, POLYFIT_DEGREE, 1> scale = 1. / (lhs.array()*lhs.array()).sqrt().colwise().sum();
 | |
|   lhs = lhs * scale.asDiagonal();
 | |
| 
 | |
|   // Solve inplace
 | |
|   Eigen::ColPivHouseholderQR<Eigen::Ref<Eigen::MatrixXf> > qr(lhs);
 | |
|   p = qr.solve(rhs);
 | |
| 
 | |
|   p = p.transpose() * scale.asDiagonal();
 | |
| }
 | |
| 
 | |
| int main(void) {
 | |
|   poly_init();
 | |
| 
 | |
| 
 | |
|   float poly[4];
 | |
|   poly_fit(pts, stds, poly);
 | |
| 
 | |
|   std::cout << "[";
 | |
|   std::cout << poly[0] << ",";
 | |
|   std::cout << poly[1] << ",";
 | |
|   std::cout << poly[2] << ",";
 | |
|   std::cout << poly[3];
 | |
|   std::cout << "]" << std::endl;
 | |
| }
 | |
| 
 |