Нахождение собственных векторов ковариационной матрицы для создания трехмерной ограничивающей сферы - PullRequest
1 голос
/ 14 октября 2010

В настоящее время я нахожусь в процессе написания функции, чтобы найти «точную» ограничивающую сферу для набора точек в трехмерном пространстве. Я думаю, что у меня есть приличное понимание процесса, но я застрял.

Вот с чем я работаю: А) Точки в 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 (), чтобы получить собственный вектор?

Спасибо

Ответы [ 2 ]

1 голос
/ 14 октября 2010

Ах, после нескольких часов изнурительных исследований мне удалось решить мою проблему.

Проблема в том, что не существует "одного" набора собственных векторов, а существует бесконечное число с различными величинами.

Метод, который я выбрал, состоял в том, чтобы использовать REF (форму эшелона строки) вместо RREF, оставляя достаточно информации в матрице, чтобы позволить мне заменить произвольное значение на z, и работать в обратном направлении, чтобы найти y и x. Затем я нормализовал вектор, чтобы получить собственный вектор единицы, который должен работать для моих целей.

Мой окончательный код:

Vect eigenVector(const Matrix &M, const float eVal) {
   Matrix A = Matrix(M);
   A -= Matrix(IDENTITY)*eVal;
   A.ref();
   float K = 16; // Arbitrary value
   float J = -K*A[m6]; // Substitute in K to find J
   float I = -K*A[m2]-J*A[m1]; // Substitute in K and J to find I

   Vect eVec = Vect(I,J,K);
   eVec.norm(); // Normalize eigenvector

   return eVec;
}

Единственная странность состоит в том, что собственные векторы выходят в противоположном направлении, чем я ожидал (они были сведены на нет!), Но это спорная проблема.

1 голос
/ 14 октября 2010

(M - λI) V - это не уравнение, это просто выражение.Однако (M - λI) V = 0 есть.И это уравнение, которое связывает собственные векторы с собственными значениями.

Итак, предполагая, что ваша функция rref работает, я хотел бы представить, что вы создаете расширенную матрицу как [(M - λI) | 0], где 0 обозначает нулевой вектор.Это похоже на то, что вы уже делаете, поэтому я должен предположить, что ваша rref функция нарушена.Или, в качестве альтернативы, он не знает, как обращаться с матрицами 4x4 (в отличие от матриц 4x3, что и следовало ожидать для расширенной матрицы).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...