Учитывая набор точек P, мне нужно найти линию L, которая наилучшим образом приближает эти точки. Я пытался использовать функцию gsl_fit_linear
из научной библиотеки GNU. Однако мой набор данных часто содержит точки, которые имеют линию наилучшего соответствия с неопределенным наклоном (x = c), поэтому gsl_fit_linear
возвращает NaN
. Насколько я понимаю, для такого рода вещей лучше всего использовать метод наименьших квадратов, потому что он быстрый, надежный и дает уравнение в терминах r и тета (так что x = c все еще можно представить). Кажется, я не могу найти какой-либо код C/C++ для этой проблемы. Кто-нибудь знает библиотеку или что-то, что я могу использовать? Я прочитал несколько исследовательских работ по этому вопросу, но тема все еще немного неясна, поэтому я не чувствую уверенности в реализации своих собственных.
Обновлять:
Я предпринял первую попытку запрограммировать свой собственный броненосец, используя данный код на этой странице в Википедии. Увы, пока безуспешно.
Это то, что у меня есть до сих пор:
void pointsToLine(vector<Point> P)
{
Row<double> x(P.size());
Row<double> y(P.size());
for (int i = 0; i < P.size(); i++)
{
x << P[i].x;
y << P[i].y;
}
int m = P.size();
int n = x.n_cols;
mat Z = join_rows(x, y);
mat U;
vec s;
mat V;
svd(U, s, V, Z);
mat VXY = V(span(0, (n-1)), span(n, (V.n_cols-1)));
mat VYY = V(span(n, (V.n_rows-1)) , span(n, (V.n_cols-1)));
mat B = (-1*VXY) / VYY;
cout << B << endl;
}
вывод из B всегда 0,5504, даже когда мой набор данных изменяется. Также я думал, что на выходе должно быть два значения, поэтому я определенно делаю что-то очень неправильное.
Спасибо!