OpenCV之人脸识别(二) 特征值与特征向量(eigen value/eigen vector)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huanghuangjin/article/details/81627024
特征值与特征向量(针对方阵):当有方阵A、非零列向量x、系数λ,满足 A*x = λ*x 时,称λ为A的特征值,x称为A的λ对应的特征向量      参看 mat.txt
    公式推导: A*x = λ*x  ->  A*x - λ*x = 0  ->  (A-λ*E)*x=0(提取x的时候,λ要乘以E)   结果为一个齐次线性方程组,且方程组有非零解
        继续推导: R(A-λ*E) < n ,  │A-λ*E│ = 0
        特征多项式: │A-λ*E│ 就是关于λ的n次多项式
        特征方程:│A-λ*E│ = 0 就是关于λ的一元n次方程

           ┌-1 1 0 ┐ 
    求 A = │-4 3 0 │ 的特征值,特征向量:
           └ 1 0 2 ┘    解: │A-λ*E│ = 0   求特征值
                            │ -1-λ  1   0  │
                            │  -4  3-λ  0  │ = 0  ->  (2-λ)*(λ-1)^2 = 0  得出特征值有三个 λ1=2,λ2=λ3=1  (几阶方阵就有几个特征值,可能有重值,甚至虚数值)
                            │   1   0  2-λ │
                                当λ=2时,(A-2*E)*x = 0   求特征向量
                                    A-2*E = ┌-3 1 0 ┐ ->通过初等行变换得:  ┌ 1 0 0 ┐ 解得:x1=0,x2=0,x3=任意值,所以          ┌0┐
                                            │-4 1 0 │                      │ 0 1 0 │                                 x = k1*│0│  k1≠0
                                            └ 1 0 0 ┘                      └ 0 0 0 ┘                                        └1┘
                                当λ=1时,同理求得        ┌ -1 ┐
                                                  x = k*│ -2 │  k≠0  ,有些特征值能得出多个特征向量
                                                        └  1 ┘
                                定理:不相同的特征值对应的特征向量之间是线性无关的

对称矩阵:沿主对角线对称的方阵,如:   ┌ 1 2 3 ┐  性质为 A=A^T
                                    │ 2 5 6 │
                                    └ 3 6 9 ┘

这里写图片描述
这里写图片描述

代码

#include "../common/common.hpp"

void main(int argc, char ** argv)
{
    Mat src = (Mat_<double>(2, 2) << 1, 2, 2, 1);
    Mat eigenValues, eigenVector;
    /*
        bool eigen( // 计算特征值,特征向量,方阵,eigen函数限制,必须是对称矩阵,其他矩阵计算出来的结果不对
            InputArray src, // 输入矩阵
            OutputArray eigenvalues, // 输出参数,特征值
            OutputArray eigenvectors = noArray() // 输出参数,特征向量
        );
    */
    bool is = eigen(src, eigenValues, eigenVector); // 如果两个相同的特征(点),其特征向量是相同的
    cout << is << endl; // 1
    /*
        [3;
         -1]
    */
    cout << eigenValues << endl;
    /*
        [0.7071067811865475, 0.7071067811865475;
         0.7071067811865475, -0.7071067811865475]
    */
    cout << eigenVector << endl; // 第一列特征向量对应第一个特征值,第二列特征向量对应第二个特征值

    getchar();
}

猜你喜欢

转载自blog.csdn.net/huanghuangjin/article/details/81627024