【matlab】QR分解

news2024/9/27 12:11:55

QR分解

给定一个m×n的矩阵A,其中m≥n,即矩阵A是高矩阵或者是方阵,QR分解将矩阵A分解为两个矩阵Q和R的乘积,其中矩阵Q是一个m×n的各列正交的矩阵,即QTQ=I,矩阵R是一个n×n的上三角矩阵,其对角线元素为正。

如果矩阵A是方阵,且各列线性无关,那么Q是一个正交矩阵,即QTQ=QQT=I。

QR分解有多种算法实现,包括Gram-Schmidt正交化方法、Householder变换方法和Givens旋转方法等,下面我们介绍Gram-Schmidt正交化方法和Householder变换方法,并在MATLAB平台上使用这两种算法来实现QR分解。

Gram-Schmidt算法

对于给定的n维向量a1,a2,……,an,Gram-Schmidt算法可以解决将其标准正交化的问题,即将一个线性无关的向量组转化为一个正交向量组,使得每个向量都与前面的向量正交(垂直),并且可以检验a1,a2,……,an是否是线性相关。

Gram-Schmidt算法的步骤如下:

  • 初始化n维向量q1,q2,……,qn,其中q1=a1/||a1||2。
  • 对于每个向量ai,i=2:n,进行正交化处理:qi= ai-( q1Tai)q1-…-( qi-1Tai)qi-1。
  • 如果qi=0,说明ai是a1,a2,……,ai-1的一个线性组合,可以结束算法了。
  • 否则将qi进行单位化,qi=qi/||qi||2。

如果步骤③没有结束,那么说明a1,a2,……,an是线性无关的,而且得到了一个正交向量组q1,q2,……,qn。

Gram-Schmidt算法实现的QR分解

对于给定矩阵A,其列向量线性无关,Gram-Schmidt算法实现的QR分解步骤如下:

  • 对列向量a1,a2,……,an按照Gram-Schmidt方法进行正交化。
  • 对上一步得到的正交化向量组进行单位化得到各列正交的矩阵Q。
  • 根据A=QR,QTQ=I→R=QTA,得到上三角矩阵R

MATLAB验证Gram-Schmidt算法实现QR分解稳定性

通过直观的方法来观察到Gram-Schmidt QR分解的正交性偏差,理论上通过Gram-Schmidt算法后可以得到列向量线性无关的各列正交的矩阵Q,即QTQ=I,我们可以直接计算QTQ,看看计算结果与单位矩阵I的差距

左图是QTQ的计算结果,有图是单位矩阵I,可见由于浮点数存储的舍入误差,随着k增大,积累的误差越大,矩阵Q逐渐失去正交性

clc,clear;
load MatrixA.mat;
[m,n]=size(A);
Q=zeros(m,n);
R=zeros(n,n);
%% Gram-Schmidt QR分解
for k=1:n
    R(1:k-1,k)=Q(:,1:k-1)'*A(:,k);  %求出R(1,K) - R(K-1,K)
    v=A(:,k)-Q(:,1:k-1)*R(1:k-1,k); %求出正交化向量q
    R(k,k)=norm(v);                 %求出R(K,K)
    Q(:,k)=v/R(k,k);                %单位化向量q
end
%% 正交性偏差
figure(1);
E = zeros(1,n);
for k=2:n
    max = 0;
    for i=1:k-1
        temp = abs(Q(:,i)' *  Q(:,k));
        if temp > max
            max = temp;
        end
    end
    E(1,k)=max;
end    
plot(E)
%% 比较QTQ和I
QTQ=Q'*Q;
figure(2);
for i=1:n
    for j=1:n
        scatter3(i,j,QTQ(i,j),'red');
        hold on;
    end
end
zlim([0,1]);
I=eye(n);
figure(3);
for i=1:n
    for j=1:n
        scatter3(i,j,I(i,j),'red');
        hold on;
    end
end
zlim([0,1]);

Householder变换

Householder变换是一种镜面反射变换,householder变换矩阵为H = I - 2wwT,如何理解这个变换矩阵呢,考虑向量w,那么有:

Hw = (I - 2wwT)w = w - 2w(wTw) = - w

这说明对于平行于w的向量,householder变换的作用是将其反向,再考虑与向量w垂直的向量v,即wTv=0,那么有:

Hv = (I - 2wwT)v = v - 2w(wTv) = v

这说明对于垂直于w的向量,householder变换的作用就是对其不起任何作用,那么对于一个普通的向量v来说,平行于w的分量被householder反向,垂直于w的分量不变,那么最终的效果就是将向量v作关于法向量为w的平面的镜像对称

 

基于Householder变换的QR分解

 因为H=H-1,所以A=H1H2,…,Hn-1R,即Q= H1H2,…,Hn-1,再根据A=QR,QTQ=I→R=QTA。

再来比较一下QTQ与单位矩阵I的差距,结果如图所示,左边的是计算出来的QTQ,右边是单位矩阵I

结果QTQ和I基本一样,可见相比其他分解方法,Householder算法能够减小舍入误差的累积,提高计算结果的稳定性。此外,该算法的时间复杂度较低,具备较高的计算效率。

clc,clear;
load MatrixA.mat;
[m,n]=size(A);
Q=zeros(m,n);
R=zeros(n,n);
%% Householder QR分解
[Q,R]=qr(A);    % matlab库函数就是用的Householder
%% 正交性偏差
figure(1);
E = zeros(1,n);
for k=2:n
    max = 0;
    for i=1:k-1
        temp = abs(Q(:,i)' *  Q(:,k));
        if temp > max
            max = temp;
        end
    end
    E(1,k)=max;
end    
plot(E)
%% 比较QTQ和I
QTQ=Q'*Q;
figure(2);
for i=1:n
    for j=1:n
        scatter3(i,j,QTQ(i,j),'red');
        hold on;
    end
end
zlim([0,1]);
I=eye(n);
figure(3);
for i=1:n
    for j=1:n
        scatter3(i,j,I(i,j),'red');
        hold on;
    end
end
zlim([0,1]);

判断矩阵是否可逆

判断矩阵是否可逆有以下几种方法:

  • 存在一个矩阵B,使得AB=BA=I,确实可逆。
  • 矩阵行列式不为0,可逆。
  • 矩阵满秩,可逆。
  • 线性方程组Ax=0只有0解,可逆。
  • 线性方程组Ax=b只有特解,可逆。

实际上如果一个方阵可以进行QR分解,那么这个方阵也是可逆的。

所以我们直接尝试对矩阵B进行QR分解,如果可以进行QR分解,那么矩阵B可逆。那么我们可以先假设矩阵B是可以进行QR分解,然后我们对矩阵B进行QR分解,显然矩阵B是可以进行QR分解的,这说明矩阵B是可逆的。

求逆

我们之前使用过高斯消元法来求解矩阵的逆,实际上也可以使用QR分解求矩阵的逆。由A = QR,QTQ = I,则A-1 = (QR)-1 = R-1Q-1 = R-1QT。

那么A-1就可以通过R-1QT得到,但是实际上我们并不需要计算R-1,让x= R-1QT,那么我们目标就是要得到x的结果,因为RR-1QT=QT,即Rx=QT,那么我们就需要求解这个线性方程组,由于R是上三角矩阵,所以直接回代就可以求出x,即求出R-1QT,即求出了A-1。

我们先用Gram-Schmidt算法实现的QR分解求解矩阵B的逆,将其与用MATLAB内置的求逆函数结果进行比较,结果如图所示,红色的圆圈是matlab内置的求逆函数计算出来的结果,绿色实心点是我们QR分解求出来的结果,如果二者重合说明计算结果相同。

可以看到基本上绿色的点都和红色的圆圈重合了,可见Gram-Schmidt算法QR分解求逆效果不错。

clc,clear;
load MatrixB.mat;
[m,n]=size(B);
Q=zeros(m,n);
R=zeros(n,n);
%% Gram-Schmidt QR分解
for k=1:n
    R(1:k-1,k)=Q(:,1:k-1)'*B(:,k);  %求出R(1,K) - R(K-1,K)
    v=B(:,k)-Q(:,1:k-1)*R(1:k-1,k); %求出正交化向量q
    R(k,k)=norm(v);                 %求出R(K,K)
    Q(:,k)=v/R(k,k);                %单位化向量q
end
%% 求逆
inverseQR=R\Q';
inverse=inv(B);
%% 画图比较
for i=0:n-1
    for j=1:n
        scatter(i*n+j,inverse(i+1,j),'red');
        hold on;
        scatter(i*n+j,inverseQR(i+1,j),'green','.');
        hold on;
    end
end

我们再用之前的高斯消元法求解矩阵B的逆,将其与用MATLAB内置的求逆函数结果进行比较,结果如图所示

可见高斯消元法求逆的结果也很好,基本上绿色的点都和红色的圆圈重合了。

clc,clear;
load MatrixB.mat;
b=eye(50);
B_b=[B,b];
[n,m]=size(B_b);
for i=1:n
    for j=m:-1:i
        B_b(i,j)=B_b(i,j)/B_b(i,i);
    end
    for j=i+1:n
        for k=m:-1:i
            B_b(j,k)=B_b(j,k)-B_b(j,i)*B_b(i,k);
        end
    end
%     fprintf('第%d次消元\n',i);
%     disp(rats(A_b));
end
for i=n-1:-1:1
    for j=i:-1:1
        for k=m:-1:n+1
            B_b(j,k)=B_b(j,k)-B_b(j,i+1)*B_b(i+1,k);
        end
        B_b(j,i+1)=0;
    end
%     fprintf('第%d次回代\n',n-i);
%     disp(rats(A_b));
end
gaussInverse=B_b(:,end-49:end);
inverse=inv(B);
%% 画图比较
for i=0:n-1
    for j=1:n
        scatter(i*n+j,inverse(i+1,j),'red');
        hold on;
        scatter(i*n+j,gaussInverse(i+1,j),'green','.');
        hold on;
    end
end

再用householder算法实现的QR分解求解矩阵B的逆,将其与用MATLAB内置的求逆函数结果进行比较,结果如图所示。

可见householder实现的QR分解求逆结果效果很好,基本上和matlab内置求逆函数结果相同,速度上也不慢。

clc,clear;
load MatrixB.mat;
[m,n]=size(B);
Q=zeros(m,n);
R=zeros(n,n);
%% Householder QR分解
[Q,R]=qr(B);    % matlab库函数就是用的Householder
%% 求逆
inverseQR=R\Q';
inverse=inv(B);
%% 画图比较
for i=0:n-1
    for j=1:n
        scatter(i*n+j,inverse(i+1,j),'red');
        hold on;
        scatter(i*n+j,inverseQR(i+1,j),'green','.');
        hold on;
    end
end

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1284486.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unity 代码控制Color无变化

Unity中,我们给Color的赋值比较常用的方法是: 1、使用预定义颜色常量: Color color Color.white; //白色 Color color Color.black; //黑色 Color color Color.red; //红色 Color color Color.green; //绿色 Color color Color.blue; …

Linux 文件查找

1 文件查找 在文件系统上查找符合条件的文件 文件查找:locate,find 1.1 locate 工作特点: 格式: Usage: locate [OPTION]... [PATTERN]...常用选项: -i :不区分大小写的搜索 -n N :只列举前…

【C进阶】C程序是怎么运作的呢?-- 程序环境和预处理(上)

前言: 由于c语言的程序编译链接的这块知识点不清楚,回来复习一遍,以便于好理解c知识,我会尽快更新下一篇文章。 目录 1.程序的翻译环境和执行环境 2.翻译环境(编译链接) 编译(编译器&#xf…

redis的keys命令和scan命令性能对比

项目场景 Redis的keys *命令在生产环境是慎用的,特别是一些并发量很大的项目,原因是Redis是单线程的,keys *会引发Redis锁,占用reids CPU,如果key数量很大而且并发是比较大的情况,效率是很慢的&#xff0c…

LLM之Agent(三):HuggingGPT根据用户需求自动调用Huggingface合适的模型

​ 浙大和微软亚洲研究院开源的HuggingGPT,又名JARVIS,它可以根据用户的自然语言描述的需求就可以自动分析需要哪些AI模型,然后去Huggingface上直接调用对应的模型,最终给出用户的解决方案。 一、HuggingGPT的工作流程 它的…

Hadoop的介绍与安装

1 Hadoop的简介 Hadoop是一个开源的大数据框架,是一个分布式计算的解决方案。Hadoop是由java语言编写的,在分布式服务器集群上存储海量数据并运行分布式分析应用的开源框架,其核心部件是HDFS与MapReduce。 HDFS是一个分布式文件系统&#x…

专业课145+总分440+东南大学920考研专业基础综合信号与系统数字电路经验分享

个人情况简介 今年考研440,专业课145,数一140,期间一年努力辛苦付出,就不多表了,考研之路虽然艰难,付出很多,当收获的时候,都是值得,考研还是非常公平,希望大…

单片机第三季-第四课:STM32下载、MDK和调试器

目录 1,扩展板使用的STM32芯片类型 2,使用普中科技软件下载程序 3,keil介绍 4,JLINK调试器介绍 5,使用普中的调试器进行debug 6,使用Simulator仿真 1,扩展板使用的STM32芯片类型 扩展版…

【EtherCAT详解】基于Wireshark的EtherCAT帧结构解析

写在前面 EtherCAT的报文比较繁琐,且一些参考书籍错误较多,且晦涩难懂,对于初学者,很难快速的入门。本文适用于有一定基础的研究者,如对报文有一些研究、对canopen协议有一定了解、并且对TwinCAT有了解的研究者。当然,对于初学者来说,也是很好的引导,少走很多弯路。本…

图中点的层次(图的BFS)

给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环。 所有边的长度都是 1,点的编号为 1∼n。 请你求出 1 号点到 n 号点的最短距离,如果从 1 号点无法走到 n 号点,输出 −1。 输入格式 第一行包含两个整数 n 和 m。 接…

Nat easy IP ACL

0表示匹配,1表示任意(主机位0.0.0.255(255主机位)) rule deny source 192.168.2.1 0 设置拒绝192.168.2.1的主机通过 记住将其应用到接口上 [AR2]acl 2000 //创建基本ACL [AR2-acl-basic-2000]rule deny source 192…

WordPress发送邮件设置

WordPress在修改登陆邮箱或找回登陆密码的时候,通常都需要发送邮件来进行操作验证,但服务商又禁止了服务器对外发送邮件的25端口,很多虚拟主机本身也禁用了mail函数,根本发不了邮件。 此时我们可以使用QQ邮箱、网易邮箱或者其他企…

Win10安装ROS2遇到的小问题

按照网上教程安装ROS2,卡在了第一步。在cmd或powershell安装Chocolatey时,出现以下两种错误: “%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe” -NoPro …~here-string 标题后面和行尾之前不允许包含任何字符。 …… 或者 使…

字符串函数strlen的用法详解及其相关题目

strlne函数的使用 一.strlen函数的声明二.strlen函数的头文件三.相关题目代码1代码2题目1题目2题目3题目4题目5题目6 一.strlen函数的声明 size_t strlen ( const char * str );二.strlen函数的头文件 使用strlen函数我们需要使用以下头文件 #include <string.h>三.相…

LaTex入门简明教程

文章目录 写在前面安装Texlive的安装TeXstudio 的安装 LaTex 的使用节指令图指令表指令公式指令参考文献指令引用指令TeXstudio 编译 LaTex 的 \label{} 写法建议最后 写在前面 这篇文章面向没有任何 LaTex 基础的小白&#xff0c;主要讲解了 LaTex 的安装和使用。读完文章之后…

SVPWM原理及simulink

关注微♥“电击小子程高兴的MATLAB小屋”获得专属优惠 一.SVPWM原理 SPWM常用于变频调速控制系统&#xff0c;经典的SPWM控制主要目的是使变频器的输出电压尽量接近正弦波&#xff0c;并未关注输出的电流波形。而矢量控制的最终目的是得到圆形的旋转磁场&#xff0c;这样就要求…

大数据项目——基于Django协同过滤算法的房源可视化分析推荐系统的设计与实现

大数据项目——基于Django协同过滤算法的房源可视化分析推荐系统的设计与实现 技术栈&#xff1a;大数据爬虫/机器学习学习算法/数据分析与挖掘/大数据可视化/Django框架/Mysql数据库 本项目基于 Django框架开发的房屋可视化分析推荐系统。这个系统结合了大数据爬虫、机器学习…

SaToken利用Redis做持久化

官网解释 官网解释 教程 引入依赖 <!-- 提供Redis连接池 --> <dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId> </dependency><!-- Sa-Token 整合 Redis &#xff08;使用 jdk 默认序…

Linux--网络编程-ftp(TCP)网络通信-文件交互

项目要求&#xff1a;实现以下内容 远程控制&#xff1a; 1、查看服务器当前路径文件 ls 3、进入、退出服务器文件夹 cd 4、上传文件到服务器 put xxx 本地控制&#xff1a; 1、查看本地&#xff08;客户端&#xff09;文件 lls 2、进入客户端文件夹 lcd 3、获取服务器的文件…

【开发PaaS】基于Postgresql的开发平台Supabase

Supadase是开源的。我们选择可扩展的开源工具&#xff0c;使其易于使用。 Supadase不是Firebase的1对1映射。虽然我们正在构建Firebase提供的许多功能&#xff0c;但我们不会以同样的方式进行&#xff1a; 我们的技术选择大不相同&#xff1b;我们使用的一切都是开源的&#…