news 2026/10/21 19:07:30

第 31 章 · 特征值分解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
第 31 章 · 特征值分解

第 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),即 ±i

eigenvalues()返回的是复数类型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 的核心就是特征值分解。

下一章,学习几何模块——旋转、四元数、刚体变换。


练习题

  1. 求对称矩阵 [3 1; 1 3] 的特征值和特征向量。
  2. 验证 A·v = λ·v。
  3. 求旋转矩阵 [0 -1; 1 0] 的特征值,观察是不是复数。
  4. 判断一个矩阵是否正定。
  5. 说说 PCA 和特征值分解的关系。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/21 21:37:52

从车友群刷屏说起:安卓车机用户被“盒子“统治了多久?

从车友群刷屏说起&#xff1a;安卓车机用户被"盒子"统治了多久&#xff1f; 【免费下载链接】DiPlay Independent CarPlay receiver for compatible Android head units. Wired and wireless public preview. 项目地址: https://gitcode.com/gh_mirrors/di/DiPlay …

作者头像 李华
网站建设 2026/10/16 10:31:34

Linux驱动-系统移植

结束了ARM架构的学习&#xff0c;现在开始Linux驱动模块的学习。首先是Linux系统移植&#xff0c;我们需要把Linux系统移植到硬件平台。今天从头到尾完整实操了整套流程&#xff1a;从理解Linux内核基础概念、搭建Ubuntu虚拟机开发环境&#xff0c;配置双网卡网络&#xff0c;使…

作者头像 李华
网站建设 2026/10/16 1:58:57

FreeRTOS 任务调度机制

一. FreeRTOS 中的任务状态一个任务通常会处于以下四种状态之一。1.1 运行态 Running当前正在使用 CPU 执行的任务处于运行态。在单核 MCU 中&#xff0c;同一时刻通常只有一个任务处于运行态。1.2 就绪态 Ready任务已经具备运行条件&#xff0c;但当前没有获得 CPU。例如&am…

作者头像 李华
网站建设 2026/10/19 21:12:56

Python 高阶语法(二):上下文管理器、with、yield 与资源安全释放——从文件到 FastAPI 数据库会话

这一篇我们会学习另一个在后端中非常重要的能力&#xff1a;with __enter__ __exit__ contextmanager yield async with它们会解释为什么文件、数据库连接、HTTP 客户端、模型资源都需要被正确打开和关闭。一、前言在编程中&#xff0c;有很多资源不能只打开、不关闭。例如&…

作者头像 李华
网站建设 2026/10/21 8:44:14

MySQL中的常用SQL语句

SQL语句的分类DDL(Data Definition Languages)语句:数据定义语言&#xff0c;这些语句定义了不同的数据段、数据库、表、列、索引等数据库对象的定义。常用的语句关键字主要包括 create、drop、alter、rename、truncate。其中 create 用于创建数据库对象&#xff0c;drop 用于删…

作者头像 李华
网站建设 2026/10/18 17:29:08

【BFS 解决拓扑排序】课程表

文章目录题目解析算法原理建图入度数组代码实现题目链接&#xff1a;207. 课程表 题目解析 拓扑排序&#xff08;Topological sorting&#xff09;要解决的问题是 如何给一个有向无环图的所有节点排序。 有向无环图 &#xff08;Directed Acyclic Graph, 缩写 DAG&#xff09…

作者头像 李华