У меня есть облако точек, и мне нужна наиболее подходящая линия. Я использую JAMA, но не знаю почему, что-то не работает. Наверное, это я не понимаю, как это работает. У меня есть Матрица Nx3 (это то, что поддерживает JAMA svd), и я получаю правильный Matrix 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;
}
Наверное, я что-то не учитываю. Не знаю, может быть, мне следует использовать другую технику или другую библиотеку.