当前位置: 首页 > news >正文

易懂的吉文斯(Givens)变换(一)

文章目录

    • 二阶Givens旋转矩阵
      • 作用于向量
      • 作用于矩阵
      • 更一般的情况

二阶Givens旋转矩阵

在QR分解中,Givens旋转是一种用于将矩阵变成上三角形的技术。

别的教程里面往往会直接给出一个n*n阶的通用Givens矩阵形式,但是这样太过抽象难懂了,而且难以领略到Givens变换的背后内涵,四臂西瓜我在学习矩阵论的时候就深陷其害,现在我写这篇教程,就是淋过雨,要为后人撑伞!

Givens矩阵,也可以叫旋转矩阵,它实际上是通过旋转,归零矩阵中的特定元素。不好理解吧?看了下面的例子就明白了。

为了方便理解,我们先以二阶为例。

作用于向量

现在我们手上有这么一个向量:
a 1 = ( 4 2 ) a_1 = \begin{pmatrix} 4\\2\end{pmatrix} a1=(42)
现在我们想把这个向量,旋转到x轴上,变成
a 1 ′ = ( r 0 ) a_1^{'} = \begin{pmatrix} r\\0\end{pmatrix} a1=(r0)
image-20240714002128670

这个变换可以用如下的方式进行表示:
( c s − s c ) ( 4 2 ) = ( 4 c + 2 s − 4 s + 2 c ) = ( r 0 ) = a 1 ′ \begin{pmatrix}c&s\\-s&c\end{pmatrix}\begin{pmatrix}4\\2\end{pmatrix} = \begin{pmatrix}4c+2s \\ -4s+2c \end{pmatrix}=\begin{pmatrix}r\\0\end{pmatrix}= a_1^{'} (cssc)(42)=(4c+2s4s+2c)=(r0)=a1

此处的
( c s − s c ) = ( cos ⁡ ( θ ) sin ⁡ ( θ ) − sin ⁡ ( θ ) cos ⁡ ( θ ) ) \begin{pmatrix}c&s\\-s&c\end{pmatrix} = \begin{pmatrix}\cos(\theta)&\sin(\theta)\\-\sin(\theta)&\cos(\theta)\end{pmatrix} (cssc)=(cos(θ)sin(θ)sin(θ)cos(θ))
表示一个标准的旋转矩阵。对应向量旋转角度$ \theta$。

于是我们可以得到下面的方程组
{ 4 c + 2 s = r − 4 s + 2 c = 0 \left \{ \begin{matrix} 4c+2s &= r \\ -4s+2c &= 0 \end{matrix} \right. {4c+2s4s+2c=r=0
因为是旋转变换,所以向量的模值不会改变, r = 4 2 + 2 2 r = \sqrt{4^2+2^2} r=42+22 就是这个模值
{ 4 c + 2 s = 4 2 + 2 2 − 4 s + 2 c = 0 \left \{ \begin{matrix} 4c+2s &=& \sqrt{4^2+2^2} \\ -4s+2c &=& 0 \end{matrix} \right. {4c+2s4s+2c==42+22 0
可以解得
{ c = 2 4 2 + 2 2 = 2 20 = 2 4.4721 = 0.4472 s = 4 4 2 + 2 2 = 4 20 = 4 4.4721 = 0.8944 \left \{ \begin{aligned}c&=\frac{2}{\sqrt{4^{2}+2^{2}}}=\frac{2}{\sqrt{20}}=\frac{2}{4.4721}=0.4472\\s&=\frac{4}{\sqrt{4^{2}+2^{2}}}=\frac{4}{\sqrt{20}}=\frac{4}{4.4721}=0.8944\end{aligned} \right. cs=42+22 2=20 2=4.47212=0.4472=42+22 4=20 4=4.47214=0.8944
因此可以得到旋转矩阵
G = ( c s − s c ) = ( 0.4472 0.8944 − 0.8944 0.4472 ) G=\begin{pmatrix}c&s\\-s&c\end{pmatrix}=\begin{pmatrix}0.4472&0.8944\\-0.8944&0.4472\end{pmatrix} G=(cssc)=(0.44720.89440.89440.4472)
现在我们终于得到了最终的运算,成功将向量旋转到了x轴上,将y坐标清零。
G ( 4 2 ) = ( 0.4472 0.8944 − 0.8944 0.4472 ) ( 4 2 ) = ( 4.4721 0 ) G\begin{pmatrix}4\\2\end{pmatrix}=\begin{pmatrix}0.4472&0.8944\\-0.8944&0.4472\end{pmatrix}\begin{pmatrix}4\\2\end{pmatrix}=\begin{pmatrix}4.4721\\0\end{pmatrix} G(42)=(0.44720.89440.89440.4472)(42)=(4.47210)

作用于矩阵

理解了上述的过程后,现在我们可以看下旋转矩阵作用于矩阵的效果了。我们有如下矩阵,他左边的向量就是上一部分的
A = ( 4 1 2 1 ) A=\begin{pmatrix}4&1\\2&1\end{pmatrix} A=(4211)
直接将上一节计算的旋转矩阵作用于 A A A
G ( 4 1 2 1 ) = ( 4.4721 1.3416 0 − 0.4472 ) G\begin{pmatrix}4&1\\2&1\end{pmatrix}=\begin{pmatrix}4.4721&1.3416\\0&-0.4472\end{pmatrix} G(4211)=(4.472101.34160.4472)
确实将A矩阵变为了上三角矩阵,实现了QR分解。其中左边的向量,正是上一节计算出来的结果。相信大家看到这里就有所领悟了。

对于矩阵,我们可以把它理解为多个列向量拼接而成。
a 1 = ( 4 2 ) a 2 = ( 1 1 ) a_1 = \begin{pmatrix} 4\\2\end{pmatrix}\\ a_2 = \begin{pmatrix} 1\\1\end{pmatrix} a1=(42)a2=(11)
那么A可以理解为他们水平拼接在一起
A = [ a 1 ∣ ∣ a 2 ] A = [a_1||a_2] A=[a1∣∣a2]
根据拼接的运算性质,旋转矩阵作用于A,相当于分别作用于 a 1 a_1 a1 a 2 a_2 a2,再将它们拼接在一起。
G ⋅ [ a 1 ∣ ∣ a 2 ] = [ G ⋅ a 1 ∣ ∣ G ⋅ a 2 ] G\cdot[a_1||a_2]=[G\cdot a_1||G\cdot a_2] G[a1∣∣a2]=[Ga1∣∣Ga2]
我们现在借助这个性质再来理解下givens作用于矩阵
G ( 4 2 ) = ( 0.4472 0.8944 − 0.8944 0.4472 ) ( 4 2 ) = ( 4.4721 0 ) G\begin{pmatrix}4\\2\end{pmatrix}=\begin{pmatrix}0.4472&0.8944\\-0.8944&0.4472\end{pmatrix}\begin{pmatrix}4\\2\end{pmatrix}=\begin{pmatrix}4.4721\\0\end{pmatrix} G(42)=(0.44720.89440.89440.4472)(42)=(4.47210)

G ( 1 1 ) = ( 0.4472 0.8944 − 0.8944 0.4472 ) ( 1 1 ) = ( 1.3416 − 0.4472 ) G\begin{pmatrix}1\\1\end{pmatrix}=\begin{pmatrix}0.4472&0.8944\\-0.8944&0.4472\end{pmatrix}\begin{pmatrix}1\\1\end{pmatrix}=\begin{pmatrix}1.3416\\-0.4472\end{pmatrix} G(11)=(0.44720.89440.89440.4472)(11)=(1.34160.4472)

对于 a 1 a_1 a1向量,借助旋转矩阵成功清零y坐标;对于 a 2 a_2 a2矩阵,旋转矩阵作用后,得到新的向量

这里给大家留个思考,有没有可能, a 2 a_2 a2矩阵,经过旋转矩阵后y轴也被清零?

G ⋅ [ a 1 ∣ ∣ a 2 ] = [ G ⋅ a 1 ∣ ∣ G ⋅ a 2 ] = [ G ( 4 2 ) ∣ ∣ G ( 1 1 ) ] = ( 4.4721 1.3416 0 − 0.4472 ) G\cdot[a_1||a_2]=[G\cdot a_1||G\cdot a_2] =[G\begin{pmatrix}4\\2\end{pmatrix} ||G\begin{pmatrix}1\\1\end{pmatrix}] =\begin{pmatrix}4.4721&1.3416\\0&-0.4472\end{pmatrix} G[a1∣∣a2]=[Ga1∣∣Ga2]=[G(42)∣∣G(11)]=(4.472101.34160.4472)

现在我们来总结下上面的清空过程,我们选择第一个列向量,通过构造givens矩阵,将其第二行清零,使得矩阵整体变为上三角形式。

到这里,相信大家能够理解最一开始的那句话,givens矩阵通过旋转作用,将矩阵变化为上三角形式。

更一般的情况

我们有如下矩阵,我们希望将c的位置,清零。
A = ( a b c d ) A=\begin{pmatrix}a&b\\c&d\end{pmatrix} A=(acbd)
构造旋转矩阵
G = ( c s − s c ) G=\begin{pmatrix}c&s\\-s&c\end{pmatrix} G=(cssc)
得到
( c s − s c ) ( a c ) = ( r 0 ) \begin{pmatrix}c&s\\-s&c\end{pmatrix}\begin{pmatrix}a\\c\end{pmatrix}=\begin{pmatrix}r\\0\end{pmatrix} (cssc)(ac)=(r0)
解方程后,我们就可以得到最终的形式:
s = sin ⁡ ( θ ) = a a 2 + c 2 c = cos ⁡ ( θ ) = c a 2 + c 2 \begin{aligned}s=\sin(\theta)=\frac a{\sqrt{a^2+c^2}}\\c=\cos(\theta)=\frac c{\sqrt{a^2+c^2}}\end{aligned} s=sin(θ)=a2+c2 ac=cos(θ)=a2+c2 c
这边读者可以带入前面的二阶例子中,熟悉计算过程,加深理解。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 如何使用Gunicorn配置SSL/TLS加密Web服务
  • 序列化与反序列化及不同序列化方式的性能对比
  • 第四章 Redis(2023版本IDEA)
  • SVN 分支管理深入解析
  • 机器人三定律及伦理分析
  • 通过 PPPOE 将 linux 服务器作为本地局域网 IPv4 外网网关
  • Zookeeper-数据结构
  • 优化Cocos Creator 包体体积
  • IDEA启动Web项目总是提示端口占用
  • VsCode远程ssh连接失败:Could not establish connection to XXX
  • Vue3学习体验(一)
  • Reinforced Causal Explainer for GNN论文笔记
  • python基础语法 005 函数1-2 函数作用域
  • Linux - 基础开发工具(yum、vim、gcc、g++、make/Makefile、git)
  • 使用Go编写的持续下行测速脚本,快速消耗流量且不伤硬盘
  • CODING 缺陷管理功能正式开始公测
  • ECMAScript6(0):ES6简明参考手册
  • Flannel解读
  • HTTP中的ETag在移动客户端的应用
  • Otto开发初探——微服务依赖管理新利器
  • session共享问题解决方案
  • Solarized Scheme
  • V4L2视频输入框架概述
  • 创建一个Struts2项目maven 方式
  • 观察者模式实现非直接耦合
  • 聊一聊前端的监控
  • 十年未变!安全,谁之责?(下)
  • 使用权重正则化较少模型过拟合
  • 在electron中实现跨域请求,无需更改服务器端设置
  • postgresql行列转换函数
  • 阿里云ACE认证学习知识点梳理
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • 新海诚画集[秒速5センチメートル:樱花抄·春]
  • 专访Pony.ai 楼天城:自动驾驶已经走过了“从0到1”,“规模”是行业的分水岭| 自动驾驶这十年 ...
  • ​2020 年大前端技术趋势解读
  • ​2021半年盘点,不想你错过的重磅新书
  • ​力扣解法汇总1802. 有界数组中指定下标处的最大值
  • ​字​节​一​面​
  • # Apache SeaTunnel 究竟是什么?
  • ## 基础知识
  • #前后端分离# 头条发布系统
  • $.ajax()
  • (8)STL算法之替换
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (附源码)spring boot儿童教育管理系统 毕业设计 281442
  • (计算机网络)物理层
  • (十八)Flink CEP 详解
  • (四)模仿学习-完成后台管理页面查询
  • (一)UDP基本编程步骤
  • (已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • ./和../以及/和~之间的区别
  • .net FrameWork简介,数组,枚举
  • .NetCore项目nginx发布