MATLAB求解矩阵特征值的六种方法

2023-11-06

MATLAB求解矩阵特征值的六种方法

关于这个特征值的求解一共六种方法
幂法
反幂法
QR方法
对称QR方法
jacobi方法
二分法

接下来就着重讲解这些算法的是如何使用的
幂法
算法如下,
输入:
矩阵A、非零矢量x0、maxit(2000)、tol(1.0e-7)
输出:
模的最大特征量a、模的最大特征量对应的特征向量x

function [a,x,n] = pmethod(A,x0,maxit,tol)
if nargin == 3
    tol = 1.0e-6;
elseif nargin == 2
    maxit = 1000;
    tol = 1.0e-6;
end
a0 = 0;
y = A * x0;
a = max(abs(y));
x = y / a;
n = 1;
while (abs(a - a0) > tol) && (n < maxit)
    a0 = a;
    x0 = x;
    y = A * x0;
    a = max(abs(y));
    x = y / a;
    n = n + 1;
end
if (n > maxit)
    disp(['迭代步数大于',num2str(maxit),'收敛太慢了!']);
else
    disp(['幂法迭代',num2str(n),'步收敛']);
end

反幂法应用幂法于矩阵的反求矩阵的特征值
输入:矩阵A、非零矢量x0、maxit(2000)、tol(1.0e-7)
输出:模的最小特征量a、模的最小特征量对应的特征向量x

function [a,x,n] = vpmethod(A,x0,maxit,tol)
if nargin == 3
    tol = 1.0e-6;
elseif nargin == 2
    maxit = 1000;
    tol = 1.0e-6;
end
[L,U,P] = lu(A);
a0 = 0;
y = utri(U,ltri(L,P*x0));
a = max(abs(y));
x = y / a;
n = 1;
while (abs(a - a0) > tol) && (n < maxit)
    a0 = a;
    x0 = x;
    y = ltri(L,P*x0);
    y = utri(U,y);
    a = max(abs(y));
    x = y / a;
    n = n + 1;
end
a = 1 / a;
if (n >= maxit)
    disp(['迭代步数大于',num2str(maxit),'收敛太慢了!']);
else
    disp(['反幂法迭代',num2str(n),'步收敛']);
end

这里还用到上次的ltri和utri函数,使用时把他们当作函数来使用就可以

%ltri
function y = ltri(L,b)
n=size(b,1);
y=zeros(n,1);
for j = 1:n-1
    y(j) = b(j)/L(j,j);
    b(j+1:n) = b(j+1:n) - y(j) * L(j+1:n,j);
end
y(n) = b(n)/L(n,n);

%utri
function x = utri(U,y)
n=size(y,1);
x=zeros(n,1);
for j = n:-1:2
    x(j) = y(j)/U(j,j);
    y(1:j-1) = y(1:j-1) - x(j) * U(1:j-1,j);
end
x(1) = y(1)/U(1,1);

QR方法利用正交相似变换
输入:
矩阵A、maxit(2000)、tol(1.0e-7)
输出:
所有特征值、所有特征值所对应的特征向量

function [a,x] = qrmd(A,maxit,tol)
%a(i,1)为第i个特征值,x(:,i)为第i个特征值对应的特征向量
if nargin == 2
    tol = 1.0e-6;
elseif nargin == 1
    maxit = 1000;
    tol = 1.0e-6;
end
A0 = A;
a0 =diag(A);
[Q,R] = qr(A);
A = R*Q;
a = diag(A);
n = 1;
while (max(abs(a-a0)) > tol) && (n <= maxit)
    a0 = a;
    [Q,R] = qr(A);
    A = R*Q;
    a = diag(A);
    n = n + 1;
end
if (n > maxit)
    disp(['迭代步数大于',num2str(maxit),'收敛太慢了!']);
else
    disp(['QR方法迭代',num2str(n),'步收敛']);
    n = size(a,1);
    x = zeros(n);
    for i = 1:n
        x0 = ones(n,1);
        [b,x0] = vpmethod(A0-a(i,1)*eye(n),x0,maxit,tol);
        x(:,i) = x0;
        a(i,:) = a(i,:) + b;
    end
end

这里也是运用到了一些常用的计算函数,直接复制在上面就可以

%ltri
function y = ltri(L,b)
n=size(b,1);
y=zeros(n,1);
for j = 1:n-1
    y(j) = b(j)/L(j,j);
    b(j+1:n) = b(j+1:n) - y(j) * L(j+1:n,j);
end
y(n) = b(n)/L(n,n);

%utri
function x = utri(U,y)
n=size(y,1);
x=zeros(n,1);
for j = n:-1:2
    x(j) = y(j)/U(j,j);
    y(1:j-1) = y(1:j-1) - x(j) * U(1:j-1,j);
end
x(1) = y(1)/U(1,1);

%vpmethod
function [a,x,n] = vpmethod(A,x0,maxit,tol)
if nargin == 3
    tol = 1.0e-6;
elseif nargin == 2
    maxit = 1000;
    tol = 1.0e-6;
end
[L,U,P] = lu(A);
a0 = 0;
y = utri(U,ltri(L,P*x0));
a = max(abs(y));
x = y / a;
n = 1;
while (abs(a - a0) > tol) && (n < maxit)
    a0 = a;
    x0 = x;
    y = ltri(L,P*x0);
    y = utri(U,y);
    a = max(abs(y));
    x = y / a;
    n = n + 1;
end
a = 1 / a;
if (n >= maxit)
    disp(['迭代步数大于',num2str(maxit),'收敛太慢了!']);
else
    disp(['反幂法迭代',num2str(n),'步收敛']);
end

对称QR方法
输入:
矩阵A、maxit(2000)、tol(1.0e-7)
输出:
所有特征值、所有特征值所对应的特征向量

function [a,x] = wilkinsonqr(A,maxit,tol)
%a(i,1)为第i个特征值,x(:,i)为第i个特征值对应的特征向量,A为实对称矩阵
if nargin == 2
    tol = 1.0e-6;
elseif nargin == 1
    maxit = 1000;
    tol = 1.0e-6;
end
n = size(A,1);
A0 = A;
A = hess(A);
a0 =diag(A);
d = (A(n-1,n-1) - A(n,n)) / 2;
u = A(n,n) + min(abs([d + sqrt(d^2 + A(n,n-1)^2),d - sqrt(d^2 + A(n,n-1)^2)]));
[Q,R] = qr(A - u * eye(n));
A = R*Q + u * eye(n);
a = diag(A);
m = 1;
while (max(abs(a-a0)) > tol) && (m <= maxit)
    a0 = a;
    d = (A(n-1,n-1) - A(n,n)) / 2;
    u = A(n,n) + min(abs([d + sqrt(d^2 + A(n,n-1)^2),d - sqrt(d^2 + A(n,n-1)^2)]));
    [Q,R] = qr(A - u * eye(n));
    A = R*Q + u * eye(n);
    a = diag(A);
    m = m + 1;
end
if (m >= maxit)
    disp(['迭代步数大于',num2str(maxit),'收敛太慢了!']);
else
    disp(['隐式对称QR方法迭代',num2str(m),'步收敛']);
    n = size(a,1);
    x = zeros(n);
    for i = 1:n
        x0 = ones(n,1);
        [b,x0] = vpmethod(A0-a(i,1)*eye(n),x0,maxit,tol);
        x(:,i) = x0;
    end

这里是要用到已经学过的ltir、utri、 vpmethod函数,直接复制上面就好
jacobi方法最古老的方法
输入:
矩阵A、maxit(2000)、tol(1.0e-7)
输出:
模的最大特征量a、模的最大特征量对应的特征向量x

function [a,V] = jacobi_eig(A,maxit,tol)
%a的元素为A的特征值,V的第j列为对应于特征值a(j,1)的特征向量
if nargin == 2
    tol = 1.0e-6;
elseif nargin == 1
    maxit = 1000;
    tol = 1.0e-6;
end
A0 = A;
n = size(A,1);
V = eye(n);
b = A0 - diag(diag(A0));
w = sqrt(sum(sum(b .* b)));
[r,c] = find(abs(b) > w);
k = 1;
while (w > tol) && (k < maxit)
    if (~isempty(r))
        for i = 1:size(r,1)
            if (r(i,1) > c(i,1))
                if (abs(A0(r(i,1),c(i,1))) < tol)
                    u = 0;
                else
                    u = acot((A0(r(i,1),r(i,1)) - A0(c(i,1),c(i,1)))...
                        / (2 * A0(r(i,1),c(i,1)))) / 2;
                end
                V1 = eye(n);
                V1(r(i,1),r(i,1)) = cos(u);
                V1(c(i,1),c(i,1)) = cos(u);
                V1(r(i,1),c(i,1)) = -sin(u);
                V1(c(i,1),r(i,1)) = sin(u);
                A0 = V1' * A0 * V1;
                V = V * V1;
                k = k + 1;
            end
        end
    end
    b = A0 - diag(diag(A0));
    w = w / n;
    [r,c] = find(abs(b) > w);
end
if (k <= maxit)
    disp(['Jacobi方法迭代',num2str(k),'步收敛!']);
else
    disp(['迭代步数大于',num2str(maxit),'收敛太慢了!']);
end
a = diag(A0);

二分法由两部分模块组成
输入:
矩阵A、maxit(2000)、tol(1.0e-7)
输出:
所有特征值、所有特征值所对应的特征向量

第一部分

function n = switch_num(T,u)
x = diag(T);
y = [0;diag(T,1)];
m = size(T,1);
q = x(1,1) - u;
n = 0;
for k = 1:m
    if (q < 0)
        n = n + 1;
    end
    if (k < m)
        if (q == 0)
            q = abs(y(k+1,1)) *  (1.0e-3); 
        end
        q = x(k+1,1) - u - y(k+1,1)^2 / q;
    end
end

第二部分
输入:
A为非零矩阵,b0,b1为所求特征值所在的区间端点、tol(1.0e-7)
输出:所有特征值、所有特征值所对应的特征向量

function [a,x] = dichotomy_eig(A,b0,b1,tol)
%A为非零矩阵,b0,b1为所求特征值所在的区间端点,返回值a为区间内的所有特征值所构成的向量
A = hess(A);
mx = max(sum(abs(A)));
if nargin == 3
    tol = 1.0e-6;
elseif nargin == 2
    b1 = mx;
    tol = 1.0e-6;
elseif nargin ==1
    b0 = -mx;
    b1 = mx;
    tol = 1.0e-6;
end
n = switch_num(A,b1) - switch_num(A,b0);
n1 = switch_num(A,b0) - switch_num(A,-mx);
a = ones(n,1)*b0;
for i = 1:n
    b0 = a(i,1);
    b1 = mx;
    while (abs(b1 - b0) > tol)
        a(i,1) = (b0 + b1) / 2;
        s = switch_num(A,a(i,1));
        if (s >= i+n1)
            b1 = a(i,1);
        else
            b0 = a(i,1);
        end
    end
end
m = size(A,1);
x = zeros(m,n);
maxit = 1000;
for i = 1:n
    x0 = ones(m,1);
    [b,x0] = vpmethod(A-a(i,1)*eye(m),x0,maxit,tol);
    x(:,i) = x0;
end

这里还是会用到已经学过的utri 、ltri 、vpmethod函数,直接复制在上面就好

参考文献
MATLAB从入门到实践–谢汉龙著

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MATLAB求解矩阵特征值的六种方法 的相关文章

  • 与超类和子类构造函数接口

    我在 matlab 文档和之前有关使用 matlab 继承和类构造函数创建接口的问题中找不到帮助 为了使其整洁 放在一个包内 我可以将其压缩如下 而不是拖拽代码 一套 MyPkg有一个超类Super和一些子类Sub1 Sub2 我的大多数属
  • MATLAB 链表

    有哪些可能的方法来实现链表MATLAB http en wikipedia org wiki MATLAB 注意 我问这个问题是为了教学价值 而不是实用价值 我意识到 如果您实际上在 MATLAB 中滚动自己的链表 那么您可能做错了什么 然
  • 在matlab中设置图例符号的精度

    我有这个 leg2 strcat Max Degree num2str adet 1 1 ch l leg3 strcat Min Degree num2str adet 1 2 ch l leg4 strcat Max Request n
  • 使用 varargin (...) 时如何显示不同的函数用法?

    当您输入 Matlab 函数名称并打开大括号时 例如sum 在命令窗口中 将打开一个工具提示 显示此函数的所有可能用法 当我编写自己的接受函数时varargin 工具提示仅显示一个选项 而不是varargin puts e g myfunc
  • 图像增强 - 从书写中清除给定图像

    我需要清理这张照片 删除 清理我 的字样并使其变亮 作为图像处理课程作业的一部分 我可能会使用 matlab 函数 ginput 来查找图像中的特定点 当然 在脚本中您应该对所需的坐标进行硬编码 您可以使用 conv2 fft2 ifft2
  • 如何使用Matlab提高PSD的分辨率

    我有音频信号 我用 Matlab 读取该信号 并使用 pwelch 获取其 PSD 这是我正在使用的代码 x Fs audioread audioFile wav x x 1 mono xPSD f pwelch x hamming 512
  • 使用 python 在网络上部署 matlab 应用程序

    您好 我想使用 python 在网络上部署 matlab 应用程序 有没有办法做到这一点 我已按照数学工作网站上的文档将我的应用程序转换为 jar 文件 java 类 有人能指出我前进的正确方向吗 事实上 您的 Matlab 代码打包为 J
  • 如何选择部分密集数据集的均匀分布子集?

    P是一个 n d 矩阵 持有nd 维样本 P某些地区的密度是其他地区的几倍 我想选择一个子集P其中任意样本对之间的距离大于d0 并且我需要将其传播到整个区域 所有样本都具有相同的优先级 无需优化任何内容 例如覆盖面积或成对距离之和 这是执行
  • 如何读取 10 位原始图像?其中包含 RGB-IR 数据

    我想知道如何从我的 10 位原始 它有 rgb ir 图像数据 数据中提取 RGB 图像 如何使用 Python 或 MATLAB 进行阅读 拍摄时的相机分辨率为 1280x720 室内照片图片下载 https drive google c
  • Matlab 编辑器不使用 emacs 快捷方式

    Is there some way I can make the matlab integrated editor not use emacs shortcut but use more normal shortcuts such that
  • 如何获取活动对象 MATLAB GUI 的句柄

    我正在尝试使用 MATLAB GUI 创建日历 我有两个Edit Text对象 edittext1 and edittext2 我想做这个 我把光标放在edittext1然后在日历中选择日期 它会进入文本字段edittext1 同样对于ed
  • 类方法的自定义代码完成?

    在 MATLAB 中 可以定义代码建议和完成 如标题为 的文档页面中所述 自定义代码建议和完成 https www mathworks com help matlab matlab prog customize code suggestio
  • 如何从绘图处理程序中绘图?

    我有绘图的处理程序或图形的处理程序 例子 h plot 1 0 2 10 xx get h xx DisplayName Annotation 1x1 handle Color 0 0 1 LineStyle LineWidth 0 500
  • 通过傅里叶空间填充进行插值

    我最近尝试在 matlab 上实现一个在傅立叶域中使用零填充的插值方法的简单示例 但我无法正常工作 我总是有一个小的频移 在傅里叶空间中几乎不可见 但它在时空上产生了巨大的误差 由于傅里叶空间中的零填充似乎是一种常见 且快速 的插值方法 因
  • 在 MATLAB 中定义其他中缀运算符

    有没有办法在 MATLAB 中定义额外的中缀运算符 具体来说 我想定义两个中缀运算符 gt and lt gt 这些符号是理想的 但如果需要 它可以是单个字符 它调用函数implies and iff以同样的方式 calls and and
  • 优化 MATLAB 代码(嵌套 for 循环计算相似度矩阵)

    我正在 MATLAB 中基于欧几里德距离计算相似度矩阵 我的代码如下 for i 1 N M N is the size of the matrix x for whose elements I am computing similarit
  • 如何在Matlab中将世界坐标转换为像素索引

    我有 512x512x313 体积的 dicom 图像 并且我有一个以世界坐标表示的点 57 7475 63 4184 83 1515 我如何在 Matlab 中获得该世界坐标的相应像素坐标 我不想戳破你的幻想 但你所要求的是不可能的 我能
  • 归一化互相关的基础知识

    我正在尝试使用范数校正2 归一化互相关 http en wikipedia org wiki Cross correlation Normalized cross correlation 来自 MATLAB 用于计算发育中胚胎中移动形状的速
  • MATLAB 可执行文件太慢

    我使用以下命令将 MATLAB 程序转换为基于控制台的应用程序deploytool在 MATLAB 中 MATLAB m文件执行大约需要 2 秒 但在我将其转换为可执行文件并调用 exe 执行需要45秒 太长了 我想将 MATLAB 程序与
  • 从筛查乳腺 X 光检查数字数据库 (DDSM) 获取数据

    我正在尝试以可读格式获取 DDSM 数据集 有谁有 DDSM heathusf 程序的工作版本 可以在 Linux 或 Windows 上正常运行吗 我知道 DDSM 的 jpeg 程序有一个适用于 linux 的工作版本 位于http w

随机推荐

  • 通过bilibili_api获取bilibili弹幕+绘制词云的方法!

    由于自己学艺不精 后续词云的简略代码没怎么看懂 梳理了一遍把整个的学习内容记录下来 主要参考的为bilibili api的教程和词云的生成教程 https blog csdn net itanders article details 888
  • 华为b6手环能升级鸿蒙吗,华为手环B6全新发布:跨界形态再升级 强劲性能革新穿戴体验...

    2020年7月30日 北京 今日 华为正式推出了融合耳机和手环形态的跨界穿戴智能手环华为手环B6 它采用1 53英寸高清3D弧面柔性屏 外观时尚 操控自如 独创的分离式设计 让这款产品兼具蓝牙耳机的舒适佩戴和华为智能手环的专业运动健康功能
  • [Ubuntu] [Qt] Ubuntu18.04.6安装Qt后打不开

    1 安装完Qt5 15 2后点击图标没反应 2 通过指令打开Qt 可以看到失败的原因是因为glibc 2 28没找到 Qt Tools QtCreator bin qtcreator software Qt Tools QtCreator
  • labelimg 修正模型错误标注遇到的问题

    场景介绍 使用了 模型 如YOLOv5 v7 detec py 保存的 YOLO 格式的结果 包括测试的图像和对应的 txt 文件 模型跑出来的结果可能不够准确 需要手工修正下 因此我需要使用 labelimg 来可视化图像 并且修改其标注
  • Tomcat安装版和解压版

    在eclipse中开发web项目经常需要在eclipse中添加tomcat服务器 之前下载了目前最新版本tomcat9的zip版 由于目前的eclipse只支持到tomcat8 原本准备就这样安装了 在浏览器输入了n次http localh
  • redis持久化操作RDB和AOF详解与操作(docker)

    redis持久化 Redis 提供了两种不同的持久化方法来将数据存储到硬盘里面 一种方法叫快照 snapshotting RDB 它可以将存在于某一时刻的所有数据都写入硬盘里面 另一种方法叫只追加文件 append only file AO
  • SVR4/4.3BSD与Linux对待伪终端的不同方式

    打开伪终端意味着打开了一个 终端对 这个终端对的其中一个是主终端 另一个是从终端 简单说主终端和类似sshd telnetd等用户空间的远程协议处理进程连接 而从终端则和shell之类的实际进程连接 在处理远程登录的时候 一般都是由远程协议
  • uniapp uview2 使用笔记

    创建项目安装组件 npm install uview ui 配置 引入uView主JS库 在项目src目录中的main js中 引入并使用uView的JS库 注意这两行要放在import Vue之后 main js import uView
  • 毕业设计-基于深度学习的肺炎医学 CT 图像分类算法研究

    目录 前言 课题背景和意义 实现技术思路 一 数据集及数据预处理 二 卷积神经网络 CNN 网络技术 三 分类模型结构与方法 三 基于改进的 Inception ResNet 的分类网络 实现效果图样例 最后 前言 大四是整个大学期间最忙碌
  • 解析网页-selenium-非常实用-python爬虫知识点7

    selenium 一 引入 二 配置Selenium chromdriver 三 Selenium的基本操作 一 设置驱动 退出驱动 driver webdriver Chrome 路径 driver quit 二 网页打开 关闭等基本操作
  • Spring Boot中优雅的判断请求来源设备并跳转对应的页面-Site preference

    在Spring Boot中优雅的判断请求来源设备并跳转对应的页面 Device detection这篇文章中已经对Spring Mobile有过简单的介绍 这里介绍的是Spring Mobile的另一种类似的方法 Site preferen
  • 结合ChatGPT制作PPT

    今天看到圈友的一个AI分享 然后自己本身需要做一个分享的PPT 刚好那着帖子实战一下 先说下整体感受 优点 制作成本确实会比较低 很熟练的话大概就是1分钟一个都有可能 整体流程是先找个第三方PPT制作网站 看下支不支持文本转PPT功能 有这
  • ASP.NET导出Excel文件

    将页面显示的订单表导出Excel文件 步骤 定义导出Excel文件的方法 private void Export string FileType string FileName Response Charset GB2312 Respons
  • Mysql_常用函数

    Mysql 常用函数 Mysql 常用字符串函数 函数 功能 concat s1 s2 sn 连接s1 s2 sn为一个字符串 insert str x y instr 将字符串str从第x位置开始 y个字符长的字串替换为字符串instr
  • 分布式发展过程

    目录 1 分布式的演变过程 1 分布式的演变过程 框架的演变过程 友情链接 分布式的演变过程 友情链接 2 分布式架构的演进 初始阶段架构 初始阶段 的小型系统 应用程序 数据库 文件等所有的资源都在一台服务器上通俗称为LAMP 特征 应用
  • opencv基础-环境配置&官方文档&源码编译

    opencv环境配置 官方文档 源码编译 前言 一 官方下载网址 二 官方文档地址 三 安装教程 1 包下载 2 环境配置 1 为什么要配置环境 2 环境变量 3 系统环境 四 配置vs工程环境 vs2019 opencv4 6 0 1 v
  • Kubernetes学习笔记之Deployment篇(六)

    Deployment概念 Kubernetes Deployment是Kubernetes中的一个控制器对象 用于管理应用程序的部署 它管理和自动更新应用程序的ReplicaSets 并确保应用程序在任何时候都有一定数量的可用实例 Depl
  • IP3 三阶交调截取点测试(转帖)

    放大器 混频器和振荡器的通用规范 本文介绍并定义了在混频器 放大器和振荡器的数据资料中用到的RF术语 包括增益 变频增益 相位噪声 三阶截取点 P1dB 插入损耗 输出功率 调谐增益和调谐范围 另外还给出了图形和图像以阐明关键的概念 这些在
  • Grouped Query Attention论文阅读

    论文 GQA Training Generalized Multi Query Transformer Models from Multi Head Checkpoints 1 背景介绍 Google在2023年发表的一篇关于Transfo
  • MATLAB求解矩阵特征值的六种方法

    MATLAB求解矩阵特征值的六种方法 关于这个特征值的求解一共六种方法 幂法 反幂法 QR方法 对称QR方法 jacobi方法 二分法 接下来就着重讲解这些算法的是如何使用的 幂法 算法如下 输入 矩阵A 非零矢量x0 maxit 2000