2012-03-15 274 views
0

我在計算特徵向量時出現問題,OpenCV中的值爲。我在Python(SciPy)中做了同樣的事情,但我在上移植我的代碼時遇到了麻煩。使用OpenCV計算特徵值,特徵向量

我有2矩陣瑞士法郎,銻其值:

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

對於瑞士法郎,銻,計算本徵值,本徵矢量的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的相同的值,銻,計算特徵值和特徵向量中的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 2012-03-15 20:01:50

+0

這個問題可能適合在[scicomp](http://scicomp.stackexchange.com) – 2012-03-17 19:28:48

回答

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你要解決的廣義特徵值問題,但只有一個自變量,它假定其他矩陣是(這通常是我們的意思,當我們說對角化)

由於矩陣是對稱的,你應該在scipy中使用eigh。實對稱矩陣給出了真正的特徵對,它將停止返回一個複數。