2024-05-11 17:43:38 +08:00

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;
}