易懂的吉文斯(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
这边读者可以带入前面的二阶例子中,熟悉计算过程,加深理解。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ceph 部署

端口号 NFS 2049 rpcbind 111 NFS 目录越深,写入性能越差 操作简单, 一.前言:存储知识 1、存储基础 单机存储设备 【1】DAS(直接附加存储,是直接接到计算机的主板总线上去的存储) IDE、SATA、SCSI、SAS…

记录些Redis题集(2)

Redis 的多路IO复用 多路I/O复用是一种同时监听多个文件描述符(如Socket)的状态变化,并能在某个文件描述符就绪时执行相应操作的技术。在Redis中,多路I/O复用技术主要用于处理客户端的连接请求和读写操作,以实现高并发…

《后端程序员 · Nacos 配置优先级动态刷新》

📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗 🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数…

J025_斗地主游戏案例开发(简版)

一、需求描述 完成斗地主游戏的案例开发。 业务:总共有54张牌; 点数:3、4、5、6、7、8、9、10、J、Q、K、A、2 花色:黑桃、红桃、方片、梅花 大小王:大王、小王 点数分别要组合4种花色,大小王各一张。…

mysql不初始化升级

1、下载mysql,下载地址:MySQL :: Download MySQL Community Server 2、解压下载好的mysql,修改配置文件的datadir指定目录为当前数据存储的目录 3、通过管理员cmd进入新版本mysql的bin目录, 然后执行命令安装mysql服务&#xff…

性能测试(2)

jmeter参数化 loadrunner Jmeter IP欺骗,也称为IP欺诈,是指通过伪装、篡改IP地址的方式,进行网络攻击或欺骗行为。这种行为可能会导致网络安全问题,包括身份盗窃、数据泄露、DDoS攻击等。为了保护自己的网络安全,用户…

「C++系列」一篇文章讲透【运算符】

文章目录 一、运算符1. 算术运算符2. 关系运算符3. 逻辑运算符4. 位运算符5. 赋值运算符6. 条件运算符(三元运算符)7. 成员访问运算符8. 指针和地址运算符9. 类型转换运算符10. 其他运算符 二、其他特殊运算符1. 成员访问运算符2. 指针和地址运算符3. 类…

C语言 ——— 模拟实现strcpy函数

目录 strcpy函数功能介绍 strcpy函数的模拟实现 strcpy函数功能介绍 学习并使用strcpy函数-CSDN博客 strcpy函数的模拟实现 代码演示&#xff1a; #include<stdio.h> #include<assert.h> char* my_strcpy(char* destination, const char* source) {assert(des…

OpenCV下的单目标定,双目标定与立体校正(calibrateCamera, stereoCalibrate and stereoRectify)

OpenCV下的单目标定&#xff0c;双目标定与立体校正(calibrateCamera, stereoCalibrate and stereoRectify) 文章目录 1. 杂话2. 单目标定2.1 先看代码2.2 一点解释2.3 calibrateCamera参数 3. 双目标定3.1 先看代码3.2 stereoCalibrate参数 4. 立体校正4.1 先看代码4.2 一点解…

Spring Security 授权

基于request的授权 HttpSecurity 权限配置 Beanpublic SecurityFilterChain filterChain(HttpSecurity http) throws Exception {http.authorizeHttpRequests(authorize -> {authorize// 放行请求:针对含有 admin 权限的用户放行 /user/get 接口.requestMatchers("/us…

训练营第十一天 | 150. 逆波兰表达式求值

150. 逆波兰表达式求值 做题思路 遇到操作符&#xff0c;出栈&#xff0c;从栈口取出俩元素&#xff1b;遇到数字&#xff0c;入栈 栈的应用场景&#xff1a;相邻元素的消除 逆波兰表达式&#xff1a;即后缀表达式 来自二叉树的后序遍历&#xff1a;左右中 代码细节 class …

有限元中弱形式的一些数学基础

有限元方法在求解PED时&#xff0c;一般先将控制方程转化为等效的若积分形式&#xff0c;本文试图总结一下这一过程的一些数学基础&#xff0c;本文主要从工程的角度出发和理解&#xff0c;不探讨严谨的数学证明过程。 PDE强形式 强形式是PDE及其边界条件的原始形式。求解强…

Java巅峰之路---基础篇---综合练习(面向对象)

目录 文字版格斗游戏 基础版 souf输出语句 进阶版 键盘录入的说明 复杂对象数组练习 需求&#xff1a; 添加和遍历 删除和遍历 修改和遍历 文字版格斗游戏 基础版 格斗游戏&#xff0c;每个游戏角色的姓名&#xff0c;血量&#xff0c;都不相同&#xff0c;在选定人…

[BJDCTF2020]Mark loves cat

黑盒直接扫 dirsearch -u http://bba9a212-64d3-4a16-88b4-3605fe3ef749.node5.buuoj.cn:81/ -w /home/kali/Desktop/dirsearch/db/dicc.txt我们用GitHack拿一下源码 没有的去下载一下&#xff0c;开源代码 cd GitHackpython GitHack.py http://bba9a212-64d3-4a16-88b4-3605…

排序算法3_冒泡排序、快速排序

一、冒泡排序 1.1 冒泡排序定义和思路 冒泡排序的基本思想是&#xff1a;通过相邻两个元素之间的比较和交换&#xff0c;使较大的元素逐渐从前面移向后面&#xff08;升序&#xff09;&#xff0c;就像水底下的气泡一样逐渐向上冒泡&#xff0c;所以被称为“冒泡”排序。  在…

垃圾收集篇

文章目录 垃圾收集算法垃圾的概念对象存活的判断引用计数器法可达性分析算法 算法标记清除算法复制算法标记压缩算法 垃圾收集的相关概念STW安全点安全区域 垃圾收集器重要指标吞吐量停顿时间 垃圾收集器的分类Serial 收集器&#xff1a;串行回收ParNew 收集器&#xff1a;并行…

【可视化大屏系列】Echarts之饼图绘制

本文为个人近期学习总结&#xff0c;若有错误之处&#xff0c;欢迎指出&#xff01; Echarts之饼图绘制 前言1.需求2.实现效果3.大概思路4.代码实现子组件写法父组件写法 5.附加&#xff08;1&#xff09;圆环饼图的绘制&#xff08;2&#xff09;南丁格尔玫瑰饼图A.半径展示数…

新手小白的pytorch学习第三弹-------tensor的基本操作

reshape, view, stacking, squeeze(), unsqueeze(),permute()torch.tensor 和 numpy 的 array切片&#xff0c;张量里面获取元素值随机种子 1 导入torch import torch2 reshape() tensor_A torch.arange(1, 11) tensor_Atensor_A.reshape(2, 5) tensor_A.reshape(2, 5)tenso…

浮点数存储方法(float,double,long double)

前言&#xff1a; 浮点数家族包括float、double、long double 类型。 如果你打出3.14&#xff0c;编译器默认是double类型的。若想让他为float类型&#xff0c;则要在前面加f&#xff1b; 1E10是科学计数法&#xff0c;代表1.010^10 (1) 浮点型如何在内存中存放&#xff1f;…

husky 和 lint-staged 构建代码项目规范

目录 前言 最简单的方法 过 scripts 来解决如果检测工具多&#xff0c;需要多次处理 通过 husky(哈士奇)来解决容易遗忘的问题 1. 安装 2. husky init 3. 试一试​ lint-stadge 只 lint 改动的 1. 安装 2. 修改 package.json 配置 3. 添加 npm 脚本: 4.使用 Husky…