37 lines
797 B
C++
37 lines
797 B
C++
|
#include <vector>
|
||
|
#include "LineFit.h"
|
||
|
|
||
|
bool LineFit(const std::vector<float> x, const std::vector<float> y, int size, double &k, double &b)
|
||
|
{
|
||
|
if (size < 2)
|
||
|
{
|
||
|
k = 0;
|
||
|
b = 0;
|
||
|
return false;
|
||
|
}
|
||
|
double x_mean = 0;
|
||
|
double y_mean = 0;
|
||
|
for (int i = 0; i < size; i++)
|
||
|
{
|
||
|
x_mean += x[i];
|
||
|
y_mean += y[i];
|
||
|
}
|
||
|
x_mean /= size;
|
||
|
y_mean /= size;
|
||
|
|
||
|
double Dxx = 0, Dxy = 0, Dyy = 0;
|
||
|
|
||
|
for (int i = 0; i < size; i++)
|
||
|
{
|
||
|
Dxx += (x[i] - x_mean) * (x[i] - x_mean);
|
||
|
Dxy += (x[i] - x_mean) * (y[i] - y_mean);
|
||
|
Dyy += (y[i] - y_mean) * (y[i] - y_mean);
|
||
|
}
|
||
|
|
||
|
double lambda = ((Dxx + Dyy) - sqrt((Dxx - Dyy) * (Dxx - Dyy) + 4 * Dxy * Dxy)) / 2.0;
|
||
|
double den = sqrt(Dxy * Dxy + (lambda - Dxx) * (lambda - Dxx));
|
||
|
k = Dxy / (Dxx - lambda);
|
||
|
b = (Dxy * x_mean) / (lambda - Dxx) + y_mean;
|
||
|
return true;
|
||
|
}
|