版权声明:本文为博主原创文章,未经博主允许不得转载。 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();
}