2012-03-15 5 views
0

У меня возникают проблемы при вычислении Собственные векторы, значения в OpenCV. Я сделал то же самое в Python (SciPy), но у меня возникли проблемы с портированием моего кода.Вычисление собственных значений, собственных векторов с использованием OpenCV

У меня есть 2 матрицы Sw, Sb, значение которого является:

Sw:[0.0112962962962963, 0.00675925925925926; 
    0.00675925925925926, 0.007962962962962963] 
Sb:[0.0530787037037037, 0.01657407407407407; 
    0.01657407407407407, 0.004606481481481482] 

Для указанного выше значений Sw, Sb, вычисления значений Эйгена собственных векторов в SciPy (Python) с использованием следующих:

from numpy import * 
from scipy import linalg as la 
evals,evecs = la.eig(Sw,Sb) 

приводит к следующему:

evals: 
[ 0.17299805+0.j -8.47412141+0.j] 
evecs: 
[[ 1.   -0.31926401] 
[-0.54311321 1.  ]] 

Я пытаюсь порт выше код для OpenCV (C++ API)

Для тех же значений Sw, Sb, вычислений собственных значений и собственных векторов в OpenCV с использованием

cv::eigen(Sb,Sb_Eig_Val,Sb_Eig_Vec); 

дает различных значений которых являются:

Sb_Eig_Val 
[0.05820394496612978; -0.0005187597809445917] 
Sb_Eig_Vec 
[0.9553644860284983, 0.2954296850952915; 
    -0.2954296850952915, 0.9553644860284983] 

Я что-то упустил?

+0

Пожалуйста, отредактируйте ваш вопрос, чтобы узнать, что вам действительно интересно знать. – DSM

+0

Этот вопрос может поместиться немного лучше в [scicomp] (http://scicomp.stackexchange.com) –

ответ

1

Вы решаете две разные проблемы с линейной алгеброй! Рассмотрим:

from scipy import linalg as la 
sw=[[0.0112962962962963, 0.00675925925925926],[0.00675925925925926, 0.007962962962962963]] 
sb=[[0.0530787037037037, 0.01657407407407407],[0.01657407407407407, 0.004606481481481482]] 
print la.eig(sb) 

Что дает:

(array([ 0.05820394+0.j, -0.00051876+0.j]), array([[ 0.95536449, -0.29542969], 
    [ 0.29542969, 0.95536449]])) 

точно как OpenCV. При scipy случае с two input arguments вы решаете проблему обобщенной собственного значения, но только с одним аргументом предполагает, что другая матрица является тождественным (как правило, это то, что мы имеем в виду, когда мы говорим диагонализация)

Поскольку матрицы симметричны, вам должен использовать eigh в scipy. Реальные симметричные матрицы дают вещественные собственные пары, и они перестанут возвращать комплексное число.

Смежные вопросы