В настоящее время я нахожусь в процессе написания функции, чтобы найти «точную» ограничивающую сферу для набора точек в трехмерном пространстве. Я думаю, что у меня есть приличное понимание процесса, но я застрял.
Вот с чем я работаю:
А) Точки в 3D пространстве
B) Ковариационная матрица 3x3, хранящаяся в классе матрицы 4x4 (на который ссылаются ячейки m0, m1, m2, m3, m4 и т. Д .; вместо строк и столбцов)
Я нашел 3 собственных значения для ковариационной матрицы точек, и я установил функцию для преобразования матрицы в уменьшенную форму ряда строк (rref) посредством исключения Гаусса.
Я протестировал обе эти функции на рисунках в примерах, которые я нашел в Интернете, и они, похоже, работают правильно.
Следующим шагом является поиск собственных векторов с использованием уравнения:
(М - & lambda; * I) * V
... где M - ковариационная матрица, & lambda; является одним из собственных значений, I - единичная матрица, а V - собственный вектор.
Однако мне кажется, что я не правильно строю матрицу 4x3 перед ее повторным указанием, поскольку крайний правый столбец, в котором должны быть рассчитаны компоненты собственного вектора, равен 0 до и после выполнения rref. Я понимаю, почему они равны нулю после (без каких-либо констант, самое простое решение линейной системы уравнений - это все коэффициенты с нулем), но я не знаю, что там поставить.
Вот функция на данный момент:
Vect eigenVector(const Matrix &M, const float eval) {
Matrix A = Matrix(M);
A -= Matrix(IDENTITY)*eval;
A.rref();
return Vect(A[m3],A[m7],A[m11]);
}
Ковариационная матрица 3x3 передается как M, а собственное значение как eval. Matrix (IDENTITY) возвращает единичную матрицу. m3, m7 и m11 соответствуют крайнему правому столбцу матрицы 4x3.
Вот пример матрицы 3x3 (хранится в классе матрицы 4x4), которую я использую для проверки функций:
Matrix(1.5f, 0.5f, 0.75f, 0,
0.5f, 0.5f, 0.25f, 0,
0.75f, 0.25f, 0.5f, 0,
0, 0, 0, 0);
Я правильно (?) Получаю собственные значения 2.097, 0.3055, 0.09756 из моей другой функции.
eigenVector () выше корректно вычитает переданное собственное значение из диагонали (0,0 1,1 2,2)
Матрица A после rref ():
[(1, 0, 0, -0),
(-0, 1, 0, -0),
(-0, -0, 1, -0),
(0, 0, 0, -2.09694)]
Для функции rref () я использую переведенную функцию python, найденную здесь:
http://elonen.iki.fi/code/misc-notes/python-gaussj/index.html
Как должна выглядеть матрица, которую я передаю rref (), чтобы получить собственный вектор?
Спасибо