У меня есть облако очков, и мне нужна лучшая подходящая линия. Я использую JAMA, но я не знаю почему, что-то не работает. Вероятно, это я, кто не понимает, как это работает. У меня есть Матрица Nx3 (это то, что поддерживает JAMA SVD), и я получаю правильную Матрицу V от Svd. Вектор, который мне нужен, - это правильный единственный вектор (строка или столбец?), Соответствующий наибольшему единственному значению. Этот вектор должен представлять основное направление.
Предполагается, что каждый вектор имеет наибольшее положительное значение y, x может быть как положительным, так и отрицательным, а z - отрицательным. Но иногда вектор, который я получаю, имеет отрицательное значение y, или в любом случае он указывает в неправильном направлении.
Мое облако точек довольно регулярное, все они расположены почти вдоль оси y (с z маленьким и отрицательным). Таким образом, основное направление должно быть действительно легко найти. Но он все еще не работает должным образом.
В этом случае я получаю вектор строки (я тоже пробовал вектор столбца) правой Матрицы V. Я уже вычел центроид из "pointSet".
public static Matrix bestDirection(Matrix pointSet){
Matrix bestFittingLine = new Matrix(3,1);
SingularValueDecomposition svd = pointSet.svd();
bestFittingLine.set(0, 0, svd.getV().get(0, 0));
bestFittingLine.set(1, 0, svd.getV().get(0, 1));
bestFittingLine.set(2, 0, svd.getV().get(0, 2));
return bestFittingLine;
}
Я думаю, может быть, я не рассматриваю что-то. ИДК, может быть, я должен использовать другую технику или другую библиотеку.