矩阵特征值和特征向量的求取

article/2025/10/6 19:08:53

最近项目中有一个模块需要求矩阵的最大特征值和特征值对应的特征向量,无奈,又重新将以前学习的这方面的知识重新温习了一遍,感觉还是当时学的不够深,所以谢谢感悟,顺便对知识点进行一个总结。

首先特征值和特征向量的求解根据项目的需求或者是矩阵的具体形式,主要可以分成如下三种形式:

  1. 自己只需要获得矩阵的最大特征值和特征值所对应的特征向量
  2. 需要求取矩阵的所有特征值
  3. 需要求取特征值和特征向量的矩阵为实对称矩阵,则可以通过另一种方法进行求解

现在我们来分析这三种形式特征值和特征向量的求取:

1.如果自己仅仅要求最大特征值的话肯定采用形式1的算法,该算法的优点是时间复杂度较低,计算量相对较小,该方法不但能够求取特征值和特征向量,而且只要特征值不全为0,该方法都能获得想要的结果。

2.如果需要获得一个矩阵的所有特征值,则通过形式2可以很好的解决该问题,但是该方法的缺点是仅仅能够获得特征值,获得特征值之后利用其它方法进行求解,这样做自然而然计算量就大了起来。

3.如果矩阵为实对称矩阵,那么可以通过形式3对其进行特征值和特征向量的求取,该方法相对于形式2的好处就是能够一次性将特征值和特征向量求取出来,缺点就是矩阵必须是实对称矩阵,至于算法复杂度方面我没有进行测试,不过猜测一下应该形式3复杂度相对来说要低一点(不然这种算法毫无有点怎么可能存活下来)。

下面对上面三种形式采用的算法进行说明:

乘幂法

乘幂法主要针对求取矩阵的最大特征值和特征向量,原理就是迭代求极限,推导过程如下:

首先我们不妨假设矩阵A的n个特征值的关系如下:

                                                                  (1)

且矩阵有相应的n个线性无关的特征向量x1,x2,x3.....xn,如果学过矩阵论就会知道,上述n个线性无关特征向量构成了n为线性空间的一组基,通俗的讲就是任意一个n维的一个向量都可以用上面n个向量进行表示,例如n维向量z0表示形式如下:

                                                                             (2)

在矩阵两边同时乘以矩阵A,则有: 

                                                            (3)

当矩阵两边连乘n个矩阵A,则有:

                                              (4)

将上式进行变换后可得:

                                      (5)

由假设可知,,所以可以得到:

                                                                                               (6)

                                                                                          (7)

由式(6)(7)联立可得矩阵最大特征值,结果如下:

                                                                                                           (8)

已知特征值由式(7)可得相应的特征向量:

                                                                                                                          (9)

由乘幂法的迭代过程容易看出,如果,那么迭代向量zk的各个非零的分量将随着而趋于无穷(或趋于零),这样在计算机上实现时就可能上溢(或下溢). 为了克服这个缺点,需将每步迭代向量进行规范化,过程如下:

                                                        (10)

                                                                                                    (11)

定理

设A是n阶实矩阵,取初始向量z0,通常取z0={1,1,.....,1},其迭代过程是:对k=1,2......,有:

                                                                                                      (12)

通过迭代,有:

                                                      (13)

证明过程如下:

                                         (14)

(15)

由式(14)和(15)联立可得:

                                                                                                                   (16)

由式(4)可知:

                                                (17)

则有:

                                                          (18)

定理第一个式子得证,下面证明第二个式子:

                           (19)

                                                 (20)

由此定理得证。

由定理可知乘幂算法步骤如下:

(1)首先寻找任意向量z0,一般情况去z0={1,1,.....1}。

(2)由z0计算得到y1,而后寻找y1向量中的最大值m1。

(3)由y1和m1得到z1,判断迭代次数是否达到,如果达到则跳到步骤4,然否则跳到步骤2循环。

(4)此时获得的mk即矩阵A的特征值,zk即为相应的特征向量,算法结束。

注:这里迭代结束判断可以是迭代次数,也可以是特征值mi前后两次的误差,我写程序的时候采用的是误差判断。

至于具体的程序,目前还未整理好,注释啥的都没写,所以暂时先不放上,等把注释写好了再贴上来。

QR算法

QR算法是针对解决形式2的算法,要看懂该算法需要一点矩阵论里面的知识,我尽量讲的通俗一点,如果还看不懂请翻翻矩阵论第四章矩阵分解的知识点。

1.QR分解

任意一个矩阵A可以分解成如下两个矩阵表达的形式:

                                                                                                                             (21)

其中矩阵Q为正交矩阵,矩阵R为上三角矩阵,至于QR分解到底是怎么回事,矩阵Q和矩阵R是怎么得到的,你们还是看矩阵论吧,如果我把这些都介绍了,感觉这篇文章要写崩,或者你可以先认可我是正确的,然后往下看。

首先我们有A1=A=QR,则令A2=RQ,则有:

                                                                                                          (22)

由式(22)可知,A1和A2相似,相似矩阵具有相同的特征值,说明A1和A2的特征值相同,我们就可以通过求取A2的特征值来间接求取A1的特征值。

定理

, {Ak}是由QR算法产生的矩阵序列,其中 ,若满足如下条件:

(1)矩阵A的特征值满足

(2),其中,而且P有三角分解P=LU,(L是单位下三角矩阵,U是上三角矩阵)。

则有:

                                                                                  (23)

上面的定理我就不证明了,因为我也不会,本人矩阵论学的也是二把刀,请见谅,但是看到上面的定理的两个条件是否能引起你的注意,首先是条件1,该条件严重限制了该方法的使用范围,矩阵的特征值不能相同且不能为0,条件2表明矩阵A能够对角化。

其大概原理就是如此,下面我们来说明QR算法的具体步骤:

(1)首先矩阵Ai进行QR分解,根据得到矩阵Qi和Ri

(2)根据矩阵Qi和Ri,得到Ai+1=Ri*Qi

(3)判断是否跳出循环条件,如果跳出循环条件则跳到步骤4,否则跳到步骤1进行循环

(4)由得到的矩阵Ai+1,该矩阵对角线上元素为矩阵A的特征向量。

Jacobi方法

Jacobi方法主要针对实对称矩阵,首先要对实对称矩阵的性质进行说明,实对称矩阵的特征向量都为正交向量,并且存在如下关系:

                                                            

上式中Q为正交矩阵,由此可见,Jacobi方法的实质和关键就是找一个正交矩阵Q,将矩阵A化为对角矩阵。

矩阵中存在两种线性变换,Givens变换和Householder变换,两种变换的共同点就是变换矩阵为正交阵。由此我们可以通过Givens变换或者Householder变换将矩阵A化为对角阵,而相应的变换矩阵的列向量即为特征向量,变换后的对角阵元素即为特征值。下面来介绍一波Givens变换:

Givens变换

设矩阵A是n阶实对称矩阵,称n阶矩阵,存在矩阵G

上面矩阵G为Givens变换对应的变换矩阵(其本质是将向量逆时针旋转一定角度后的新向量),通过改变左乘该矩阵可以将第i行第j列的元素变成0,通过(n-1)(n-2)/2次变换即可将n*n矩阵变换成对角阵,这就是Jacobi方法的原理。

注:左乘矩阵G只会改变原来矩阵第i行,第i列;第j行;第j列中的元素,所以通过下面式子可以很快利用原矩阵获得新矩阵的各个元素,计算式子如下:

不知道你们对上面的说的算法原理之后会不会产生一个疑问,如果我经过一次变换将一个元素变成0之后下一次变换后会不会该元素会不会又不为0了??答案是肯定会的,但是为啥这样的算法还能用呢??下面定理解决了这个疑问:

上述定理可知,Givens变换后矩阵各个元素的总和是不变的,而可以证明,我们每次变换之后,非对角线上的元素的总和都变小了,相应的对角线上的元素都变大了,所以当非对角线上元素总和小于某个误差值时,我们可以认为对角线上的元素即为特征值,这就是上述定理的理论依据。

Jacobi算法步骤:

(1)找到矩阵Ai中非对角线上最大的元素,将利用Givens变换将该元素变换成0

(2)利用公式可以得到变换后的矩阵Ai+1。

(3)获得左乘矩阵Gi。

(4)计算变换后矩阵Ai+1的非对角线元素和,如果满足小于误差值的要求即跳到步骤5,否则跳到步骤1进行循环

(5)变换后矩阵Ak对角线元素即为特征值,变换矩阵Gk*Gk-1........G1连乘得到矩阵G,G的列向量即为特征向量。

至于代码,整理好再贴出来。

 


http://chatgpt.dhexx.cn/article/OeNClZpA.shtml

相关文章

matlab如何求矩阵特征值

根据线性代数理论,特征值与特征向量只存在于方阵。如下所示为一方阵A: 在matlab输入矩阵: A [1 2 4; 4 0 7 9 1 3]; 查阅matlab help可以知道,利用eig函数可以快速求解矩阵的特征值与特征向量。 格式:[V,D] eig(A) 说…

delphi 连接轻量级数据库 sqlite3

环境: windows7-64, delphi7, sqlite3 最近搞个小工具,要用到轻量级数据库。以前小型数据库是用mdb的,但连接mdb 需要odbc的支持。 对环境依赖性很大,于是换了一种传说中的轻量级数据库。 sqlite 很小巧,delphi 7 连接sqlite…

轻量级数据库sqlite,spring boot+sqlite的配置详解 (一)

spring bootsqlite的配置,及成功运行详解 sqlite数据库的安装与调试 首先,通过sqlite官方地址下载对应的安装包 https://www.sqlite.org/download.html 下载对应版本的安装包和工具包 解压后会得到这几个文件,将这几个文件放在同一目录下 …

腾讯云——轻量数据库服务

轻量数据库服务采用腾讯云自研的新一代云原生数据TDSQL-C,融合了传统数据库、云计算与新硬件技术的优势,100%兼容 MySQL,实现超百万级 QPS 的高吞吐,128TB 海量分布式智能存储,保障数据安全可靠。 定制内核&#xff1…

轻量级关系数据库SQLite的安装和SpringBoot整合

简介 SQLite是轻量级的关系型数据库,适用于中小型应用场景:如安卓、网站、终端设备。并且轻量(服务端1M)、方便移植(只需要移动*.db文件到另外一台电脑) 安装 官网链接:https://www.sqlite.o…

HarmonyOS之数据管理·轻量级偏好数据库的应用

一、简介 ① 基本概念 轻量级偏好数据库主要提供轻量级 Key-Value 操作,支持本地应用存储少量数据,数据存储在本地文件中,同时也加载在内存中的,所以访问速度更快,效率更高。轻量级偏好数据库属于非关系型数据库&…

使用 C# 开发的轻量级开源数据库 LiteDB

你好,这里是 Dotnet 工具箱,定期分享 Dotnet 有趣,实用的工具或组件,希望对您有用! 简介 LiteDB 是一个小型、快速、轻量级的 .NET NoSQL 嵌入式数据库,也就是我们常说的 K/V 数据库,完全用 C…

开源轻量级数据库访问框架

本框架为开源框架,旨在简化用户的数据库操作,提供便捷的数据库访问服务而封装。该框架依赖于JDBC,并且基于原生JAVA SE框架的封装。 框架对比 对于经常进行数据库开发和JAVA EE开发的编程人员而言,其最先使用到的数据持久化方式…

Android学习之轻量级数据库SQLite

Android中对数据的存储有很多种方式,Google为Andriod中较大的数据处理提供了SQLite数据库,SQLite是一款轻型的数据库,它在管理、使用和维护上非常强大。当然最主要的特点还是它的轻量级,适合在移动设备上使用。 今天主要来讲下最…

收藏!Python内置的轻量级数据库竟如此好用!全网最实用sqlite3实战项目。

前段时间推送了一篇Python操作MySQL数据库的文章:我用 Python 处理3万多条数据,只要几秒钟……,文章发布后反应很好,很多粉丝给我私信,有的朋友说:MySQL安装起来太麻烦了,有没有更简便的方法&am…

SQLTools: 一款全功能的 VScode 轻量级数据库管理插件

公众号关注 「奇妙的 Linux 世界」设为「星标」,每天带你玩转 Linux ! VSCode SQLTools 是一个非常轻量级的数据库管理插件,可以在 VSCode 中轻松管理数据库连接、查询、SQL语句智能提示、书签、查询历史等等,常用的管理功能都有。…

c#中使用轻量级数据库sqlite开发总结

首先简单说明下含义,sqlite数据库是一种轻量级的数据库,主要特点是免安装、免配置、简单小巧,在程序中的开发基本和sql数据库一致。 准备工具:system.data.sqlite.dll和sqlite-shell-win32-x86-3081101,前者用来在程序…

最近发现的 3 个 Python 轻量级数据库,好用到爆!

你好,我是征哥,在写程序的时候经常会需要将数据保存到本地,比如是配置文件,或者是中间过程数据,通过情况下我会选择 json、pickle 或者 sqlite。但是他们都有点不大方便。 比如 json 和 pickle,需要先序列化…

sqlite原理分析和开发应用

概述 SQLite介绍 自几十年前出现的商业应用程序以来,数据库就成为软件应用程序的主要组成部分。正与数据库管理系统非常关键一样,它们也变得非常庞大,并占用了相当多的系统资源,增加了管理的复杂性。随着软件应用程序逐渐模块模块…

SQLite3-轻量级数据库

SQLite主页:SQLite Home Page SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的,而且已经在很多嵌入式产品中使…

Wise Duplicate Finder(重复文件查找工具)v1.2.9.40中文免费版

Wise Duplicate Finder是一款简洁高效的重复文件管理工具,通过匹配文件名,文件大小或内容来查找和删除重复的文件,使用户摆脱烦人的重复文件,释放更多磁盘空间,有需要的赶快下载吧! 功能介绍: …

如何查找和删除Endnote中重复的文献

点击Reference,在列表中找到“Find Duplicates”

Linux命令模糊查找

1,在某文件夹下查找,且模糊匹配 find . -name xx* 且中间都必须用空格间隔 2,mv 命令格式运行结果mv 文件名 文件名将源文件名改为目标文件名mv 文件名 目录名将文件移动到目标目录mv 目录名 目录名目标目录已存在,将源目录…

文件包含漏洞详解

文章目录 文件包含概述漏洞产生原因漏洞特点小知识文件包含函数includerequireinclude_oncerequire_once 文件包含示例pikachu靶场本地文件包含漏洞演示pikachu靶场远程文件包含漏洞演示文件包含漏洞的利用PHP伪协议(文件包含漏洞常用的利用方法)文件包含…

【操作系统实验】Ubuntu Linux 虚拟机文件查找相关命令

文章目录 whereishelpmanfindlocategrepwc管道 whereis 功能描述:寻找命令的二进制文件。 同时也会找到其帮助文件,主要功能是寻找一个命令所在的位置。和find相比,whereis查找的速度非常快。 语法: whereis [选项] [命令名称] …