第 20 章讲了特征值的概念,本章讲如何在 Eigen 里求解特征值和特征向量,以及它们的应用。
31.1 对称矩阵:SelfAdjointEigenSolver
对称矩阵(Aᵀ=A)的特征值全是实数,用SelfAdjointEigenSolver:
#include<Eigen/Dense>#include<Eigen/Eigenvalues>#include<iostream>intmain(){Eigen::Matrix3d A;A<<2,1,0,1,3,1,0,1,2;// 对称矩阵Eigen::SelfAdjointEigenSolver<Eigen::Matrix3d>solver(A);if(solver.info()!=Eigen::Success){std::cout<<"分解失败"<<std::endl;return1;}Eigen::Vector3d eigenvals=solver.eigenvalues();// 特征值(升序)Eigen::Matrix3d eigenvecs=solver.eigenvectors();// 每列一个特征向量std::cout<<"特征值(升序)= "<<eigenvals.transpose()<<std::endl;std::cout<<"特征向量(每列一个):\n"<<eigenvecs<<std::endl;return0;}存成ch31.cpp,按附录 C.3 编译运行,实际输出:
特征值(升序)= 1 2 4 特征向量(每列一个): 0.57735 -0.707107 0.408248 -0.57735 9.02056e-17 0.816497 0.57735 0.707107 0.408248中间那一列的9.02056e-17就是 0(浮点残渣)。特征向量是单位长度的,(0.57735, -0.57735, 0.57735)的长度正好是 1——这就是 0.57735 = 1/√3 的由来。
要点:
eigenvalues():特征值,按从小到大排序eigenvectors():特征向量,每列对应一个特征值
31.2 验证 A·v = λ·v
Eigen::Vector3d v=solver.eigenvectors().col(0);// 第 1 个特征向量doublelambda=solver.eigenvalues()(0);// 第 1 个特征值std::cout<<"A*v =\n"<<A*v<<"\n";std::cout<<"λ*v =\n"<<lambda*v<<"\n";// 两者应相等31.3 一般矩阵:EigenSolver
非对称矩阵的特征值可能是复数,用EigenSolver:
Eigen::Matrix2d B;B<<0,-1,1,0;// 旋转 90° 矩阵Eigen::EigenSolver<Eigen::Matrix2d>gen(B);std::cout<<"特征值(复数)=\n"<<gen.eigenvalues()<<std::endl;// 输出 (0,1) 和 (0,-1),即 ±ieigenvalues()返回的是复数类型std::complex<double>,所以能表示虚数特征值。
31.4 判断矩阵是否正定
正定矩阵= 所有特征值都 > 0 的对称矩阵:
doubleminEigen=solver.eigenvalues()(0);// 最小特征值if(minEigen>0){std::cout<<"A 是正定矩阵"<<std::endl;}else{std::cout<<"A 不是正定矩阵"<<std::endl;}正定判断在优化、力学里很重要。
31.5 应用:主成分分析(PCA)的直觉
PCA 是机器学习里降维的核心方法,本质就是求协方差矩阵的特征值和特征向量:
- 最大特征值对应的特征向量 = 数据"方差最大"的方向(第一主成分)
- 依次递减,就是第二、第三主成分
// 概念示意:数据 X 的协方差矩阵,求其特征分解Eigen::MatrixXd X=...;// n 个样本,每个 d 维Eigen::MatrixXd centered=X.rowwise()-X.colwise().mean();// 中心化Eigen::MatrixXd cov=(centered.transpose()*centered)/(X.rows()-1);// 协方差Eigen::SelfAdjointEigenSolver<Eigen::MatrixXd>es(cov);// 最大的特征值对应的特征向量就是第一主成分理解这个思路,你就知道特征值分解在机器学习里为什么这么重要了。
31.6 小结
- 对称矩阵:
SelfAdjointEigenSolver,特征值升序,特征向量每列一个。 - 一般矩阵:
EigenSolver,特征值可能是复数。 - 验证:A·v = λ·v。
- 正定 = 所有特征值 > 0。
- 应用:PCA 的核心就是特征值分解。
下一章,学习几何模块——旋转、四元数、刚体变换。
练习题
- 求对称矩阵 [3 1; 1 3] 的特征值和特征向量。
- 验证 A·v = λ·v。
- 求旋转矩阵 [0 -1; 1 0] 的特征值,观察是不是复数。
- 判断一个矩阵是否正定。
- 说说 PCA 和特征值分解的关系。