使用OpenCV计算特征值,特征向量

问题描述:

我在计算特征向量时出现问题,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

你正在解决两个不同的线性代数问题!试想一下:

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。实对称矩阵给出了真正的特征对,它将停止返回一个复数。