4.6 QR分解二:Householder变换

news2025/1/11 1:59:44

1 Householder reflector

  Householder反射是这样子的(图片来自瑞典皇家理工学院):
在这里插入图片描述
  图中u是长度为1的向量。x是任意向量,H是u的Householder reflector。可见无论x是什么向量, H x Hx Hx始终除于和u正交的平面上。H和u的关系是:
H = I − 2 u u ∗ H=I-2uu^* H=I2uu
   u ∗ u^* u是u的共轭转置, u u u是单位向量。在有些书上,也写成 u H u^H uH.也就是说H这个矩阵是由 u u u确定的。那么接下来的问题是如何精确控制变换方向了。如果能精确控制,把向量投影到标准基的方向上,那么QR分解就容易了。
  那么这和QR分解有什么关系呢?

2 分解步骤

  首先把矩阵A按列向量分块,为 ( a 1 , a 2 , ⋯   , a n ) (a_1,a_2,\cdots,a_n) (a1,a2,,an),设单位矩阵的第一列为 e 1 e_1 e1,取 u u u向量为以下向量:
u = a 1 − ∥ a 1 ∥ e 1 ∥ ( a 1 − ∥ a 1 ∥ e 1 ) ∥ u=\frac{a_1-\parallel a_1 \parallel e_1}{\parallel (a_1-\parallel a_1 \parallel e_1)\parallel} u=(a1a1e1)a1a1e1
  用这个 u u u向量构造的Householder矩阵 H H H会把 a 1 a_1 a1投影到 e 1 e_1 e1的方向上。也就是:
H a 1 = ∥ a 1 ∥ e 1 Ha_1=\parallel a_1 \parallel e_1 Ha1=∥a1e1
  那么 H A HA HA就是这个样子:
H A = H ( a 1 , a 2 , ⋯   , a n ) = ( ∥ a 1 ∥ ⋯ ∗ 0 ⋯ ∗ ⋮ ⋱ ∗ 0 ⋯ ∗ ) HA=H(a_1,a_2,\cdots,a_n)=\begin{pmatrix}\parallel a_1\parallel & \cdots & *\\ 0 &\cdots & * \\ \vdots & \ddots & *\\ 0 & \cdots & * \end{pmatrix} HA=H(a1,a2,,an)= a100
  把右边的矩阵叫做B,那么有:
H A = B H − 1 H A = H − 1 B A = H − 1 B HA=B\\ H^{-1}HA=H^{-1}B\\ A=H^{-1}B HA=BH1HA=H1BA=H1B
  Householder变换矩阵是自逆矩阵,也是对合矩阵,所以 H = H − 1 H=H^{-1} H=H1.所以又有:
A = H B A=HB A=HB
   B B B矩阵的右下角,再当成新的子矩阵,继续完成这个过程,这样得到一系列的H矩阵,编号为 H 1 , H 2 , ⋯   , H n H_1,H_2,\cdots,H_n H1,H2,,Hn.这写矩阵乘以 A A A,得到的结果也是不断把对角线以下的元素变成 0 0 0,所以最终结果就是上三角矩阵 R R R。但是会发现这些Householder矩阵是不同阶的。为了同阶,可以在对角线上补1,凑成 n n n阶矩阵,这种左上角补1的矩阵乘以任何矩阵不会改变左上角的元素。如下面这样处理:
H ˜ i = ( 1 1 ⋱ H i ) n \~H_i=\begin{pmatrix}1 \\ & 1\\ & & \ddots\\ & & & H_i\end{pmatrix}_n H˜i= 11Hi n
  所以整个过程就是:
H ˜ n H ˜ n − 1 ⋯ H ˜ 2 H ˜ 1 A = R H ˜ 1 − 1 H ˜ 2 − 1 ⋯ H ˜ n − 1 − 1 H ˜ n − 1 H ˜ n H ˜ n − 1 ⋯ H ˜ 2 H ˜ 1 A = H ˜ 1 − 1 H ˜ 2 − 1 ⋯ H ˜ n − 1 − 1 H ˜ n − 1 R A = H ˜ 1 − 1 H ˜ 2 − 1 ⋯ H ˜ n − 1 − 1 H ˜ n − 1 R A = H ˜ 1 H ˜ 2 ⋯ H ˜ n − 1 H ˜ n R \~H_n\~H_{n-1}\cdots \~H_2\~H_1A=R\\ \~H_1^{-1}\~H_2^{-1}\cdots \~H_{n-1}^{-1}\~H_n^{-1}\~H_n\~H_{n-1}\cdots \~H_2\~H_1A=\~H_1^{-1}\~H_2^{-1}\cdots \~H_{n-1}^{-1}\~H_n^{-1}R\\ A=\~H_1^{-1}\~H_2^{-1}\cdots \~H_{n-1}^{-1}\~H_n^{-1}R\\ A=\~H_1\~H_2\cdots \~H_{n-1}\~H_nR\\ H˜nH˜n1H˜2H˜1A=RH˜11H˜21H˜n11H˜n1H˜nH˜n1H˜2H˜1A=H˜11H˜21H˜n11H˜n1RA=H˜11H˜21H˜n11H˜n1RA=H˜1H˜2H˜n1H˜nR
  最终这些拼凑为 n n n阶的矩阵连乘起来,就是Q矩阵,最终的结果就是R矩阵。

3 举例

  以这个矩阵为例子:
( 0 3 1 0 4 − 2 2 1 2 ) \begin{pmatrix}0 & 3 & 1\\ 0 & 4 & -2\\ 2 & 1 & 2\\ \end{pmatrix} 002341122
  第一次分解得到:
( 0 3 1 0 4 − 2 2 1 2 ) = ( 0 0 1 0 1 0 1 0 0 ) ( 2 1 2 0 4 − 2 0 3 1 ) \begin{pmatrix}0 & 3 & 1\\ 0 & 4 & -2\\ 2 & 1 & 2\\ \end{pmatrix} = \begin{pmatrix}0 & 0 & 1\\ 0 & 1 & 0\\ 1 & 0 & 0\\ \end{pmatrix} \begin{pmatrix}2 & 1 & 2\\ 0 & 4 & -2\\ 0 & 3 & 1\\ \end{pmatrix} 002341122 = 001010100 200143221
  第二次分解得到:
( 2 1 2 0 4 − 2 0 3 1 ) = ( 1 0 0 0 0.8 0.6 0 0.6 − 0.8 ) ( 2 1 2 0 5 − 1 0 0 − 2 ) \begin{pmatrix}2 & 1 & 2\\ 0 & 4 & -2\\ 0 & 3 & 1\\ \end{pmatrix} = \begin{pmatrix}1 & 0 & 0\\ 0 & 0.8 & 0.6\\ 0 & 0.6 & -0.8\\ \end{pmatrix} \begin{pmatrix}2 & 1 & 2\\ 0 & 5 & -1\\ 0 & 0 & -2\\ \end{pmatrix} 200143221 = 10000.80.600.60.8 200150212
  第三次分解得到:
( 2 1 2 0 5 − 1 0 0 − 2 ) = ( 1 0 0 0 1 0 0 0 − 1 ) ( 2 1 2 0 5 − 1 0 0 2 ) \begin{pmatrix}2 & 1 & 2\\ 0 & 5 & -1\\ 0 & 0 & -2\\ \end{pmatrix} = \begin{pmatrix}1 & 0 & 0\\ 0 & 1 & 0\\ 0 & 0 & -1\\ \end{pmatrix} \begin{pmatrix}2 & 1 & 2\\ 0 & 5 & -1\\ 0 & 0 & 2\\ \end{pmatrix} 200150212 = 100010001 200150212

4 Python实现

  代码实现如下:

    @staticmethod
    def householder_u(x, z, inner_product_matrix=None):
        x_len = vector_len(x, inner_product_matrix)
        xz = mul_num(z, x_len)
        complement = sub(x, xz)
        complement_len = vector_len(complement, inner_product_matrix)
        return mul_num(complement, 1 / complement_len)

    # 获取householder变换的u向量
    def get_householder_u(self, inner_product_matrix=None):
        a1 = self.__vectors[0]
        n = len(a1)
        e1 = [0] * n
        e1[0] = 1
        return Matrix.householder_u(a1, e1, inner_product_matrix)

    # 获取householder矩阵
    def householder_matrix(self, inner_product_matrix=None):
        n = len(self.__vectors)
        unit = Matrix.unit_matrix(n)
        u = self.get_householder_u(inner_product_matrix)
        u_matrix = Matrix([u])
        h = Matrix(unit) - u_matrix * u_matrix.transpose_matrix() * 2
        return h

    # householder变换
    def householder(self, inner_product_matrix=None):
        n = len(self.__vectors)
        r = self
        q = Matrix(Matrix.unit_matrix(n))
        for i in range(n):
            # 子矩阵
            sub_matrix_array = [r.__vectors[j][j:] for j in range(i, n)]
            sub_matrix = Matrix(sub_matrix_array)
            sub_h = sub_matrix.householder_matrix(inner_product_matrix)
            # 左上角补1
            h_array = Matrix.unit_matrix(n)
            for j in range(i, n):
                for k in range(i,n):
                    h_array[j][k] = sub_h.__vectors[j-i][k-i]
            h = Matrix(h_array)
            r = h * r
            print((h * r).to_latex(), '=',h.to_latex(), r.to_latex())
            # sub_r 的内容
            q = q * h
        return q, r

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

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

相关文章

【z-library平替】Clibrary中文图书馆,电子书大全

目录1、z-library和Clibrary简介2、Clibrary网址3、具体操作界面1、z-library和Clibrary简介 喜欢阅读的盆友多多少少可能都听过z-library,书籍库非常全,而且是免费的,但是在z-library国内下线后,就一直没有找到合适的平替书库。 …

【vue2】vuex超超超级详解!(核心五大配置项)

🥳博 主:初映CY的前说(前端领域) 🌞个人信条:想要变成得到,中间还有做到! 🤘本文核心:vuex基础认识、state、getters、mutations actions、modules使用 目录(文末原素材) 一、…

新年找工作?python带你批量采集招聘数据

前言 大家早好、午好、晚好吖 ❤ ~ 必备素材: stealth.min.js 谷歌浏览器谷歌驱动selenium3.141.0 不知道怎么弄嘚同学可以私我获取哦~ 开发环境: python 3.8 pycharm 专业版 操作步骤 selenium 模块: 操作浏览器 打开一个浏览器 打开一个网址 获取数据 保存数据 …

性能测试工具-nmon

nmon 文章目录nmon介绍下载Linux系统服务器在服务器上新建nmon文件夹将下载文件上传到服务器新建的文件夹内修改文件名启动nmon启动nmon命令行使用nomn_analyser对监控结果进行分析图表分析nmon 主要用来做性能测试时对服务器的监控 捕捉各类系统资源的使用情况,并…

Maven实战-2.pom.xml标签说明

前言 持续更新中… pom.xml文件 1.<project> 这是pom.xml的根元素&#xff0c;所有的标签都包含在<project>…</project>之间。 2.<modelVersion> 指定当前POM模型的版本&#xff0c;对于maven2和maven3来说&#xff0c;它只能是4.0.0 <mode…

【linux】剖析底层——带你详细了解Linux内核源码的构成及其作用(1)

目录 一、arch文件 1.作用 2.arch文件下的子文件示意图 3.各个子文件的作用 &#xff08;1&#xff09;alpha &#xff08;2&#xff09;arc &#xff08;3&#xff09;arm &#xff08;4&#xff09;arm64 &#xff08;5&#xff09;cshy &#xff08;6&#xff09;…

8 加载数据集

文章目录前提知识了解数据集Mini-Batch常用术语DataLoader核心参数核心功能小tips课程代码实例课程来源&#xff1a; 链接课程文本部分来源&#xff08;参考&#xff09;&#xff1a; 链接以及&#xff08;强烈推荐&#xff09; Birandaの前提知识了解 enumerate函数 数据集 …

局域网中UTP连接,如何实现防止芯片损坏,防止信号产生各种误码,及实现CHIP之间的阻抗匹配

Hqst盈盛电子导读&#xff1a;局域网中UTP连接&#xff0c;如何实现防止芯片损坏&#xff0c;防止信号产生各种误码&#xff0c;及实现CHIP之间的阻抗匹配&#xff0c;浅谈网络滤波器作用一&#xff0c;在有线局域网中&#xff0c;计算机与服务器之间&#xff0c;计算机与路由器…

10、条件语句

目录 一、if语句的基本形式 1. if语句形式 2. if…else语句形式 3. else if语句形式 二、if的嵌套形式 三、条件运算符 四、switch语句 1. switch语句的基本形式 2. 多路开关模式的switch语句 一、if语句的基本形式 在if语句中&#xff0c;首先判断表达式的值&#x…

【BetterBench】2023年美赛辅导

通知 2023年美赛快开始啦&#xff0c;提醒大家比赛信息&#xff0c;比赛期间我会全称提供辅导&#xff0c;包括建模方案、实现代码&#xff01; 可以参考往年所有建模比赛&#xff0c;本人开源的建模方案及实现代码 2020-2023年所有数学建模竞赛专栏 报名信息 1.辅助报名截止…

【异常】前端Babel提示 Support for the experimental syntax ‘jsx‘ isn‘t currently enabled

一、报错内容 17:33:41 - Building for production... 17:34:13 ERROR Failed to compile with 5 errors5:34:09 PM 17:34:13 17:34:13 error in ./src/layout/components/Sidebar/Item.vue?vue&typescript&langjs& 17:34:13 17:34:13 Syntax Error…

《流浪地球2》看不懂?根服务器、权威解析,专业科普来了

随着《流浪地球2》的上映&#xff0c;关于国产硬科幻电影的话题也火爆起来&#xff0c;片中各种脑洞大开&#xff0c;科技设定可圈可点&#xff0c;例如量子计算机、脑机接口、太空电梯等。从专业角度来看&#xff0c;作为国产科幻大片之光的《流浪地球2》为了保证真实性确实狠…

二叉平衡树 之 红黑树 (手动模拟实现)

目录 1、红黑树的概念 2、红黑树的性质 3、红黑树节点的定义 4、红黑树的插入 5、红黑树验证 代码汇总 6、红黑树的删除&#xff08;了解&#xff09; 7、红黑树的应用 8、红黑树 VS AVL树 1、红黑树的概念 红黑树&#xff0c;就是一种特殊的二叉搜索树&#xff0c;每个…

MySQL详解(四)——高级 2.0

性能分析 Explain 使用EXPLAIN关键字可以模拟优化器&#xff08;不改变查询结果前提下&#xff0c;调整查询顺序&#xff0c;生成执行计划&#xff09;执行SQL查询语句&#xff0c;从而知道MySQL是如何处理你的SQL语句的。分析你的查询语句或是表结构的性能瓶颈 功能&#x…

ECharts线性渐变色示例演示(2种渐变方式)

第003个点击查看专栏目录Echarts的渐变色采用了echarts.graphic.LinearGradient的方法&#xff0c;可以根据代码中的内容来看如何使用。线性渐变&#xff0c;多用于折线柱形图&#xff0c;前四个参数分别是 x0, y0, x2, y2, 范围从 0 - 1&#xff0c;相当于在图形包围盒中的百分…

PTA L1-025 正整数A+B(详解)

前言&#xff1a;本期是关于正整数AB的详解&#xff0c;内容包括四大模块&#xff1a;题目&#xff0c;代码实现&#xff0c;大致思路&#xff0c;代码解读&#xff0c;今天你c了吗&#xff1f; 题目&#xff1a; 题的目标很简单&#xff0c;就是求两个正整数A和B的和&#xf…

用户使用苹果AirTag来追踪宠物存在风险,苹果Find My功能用处广

苹果的 AirTag 不失为追踪宠物的一种便捷方式&#xff0c;这样宠物即便挣脱宠物圈或者其它方式丢失&#xff0c;都可以通过“Find My”方式追踪定位。正如《华尔街日报》所指出的&#xff0c;这种方式也存在 AirTag 被宠物吞食的风险。 AirTag 的直径为 1.26 英寸&#xff0c…

【Faster R-CNN】之 Resize_and_Padding 代码精读

【Faster R-CNN】之 Resize_and_Padding1、前言&#xff1a;2、resize_image_and_bbox1&#xff09;先对图像做resize处理2&#xff09;再对 bounding box 做resize处理3、padding_images代码1、前言&#xff1a; 在上一篇文章 【Faster R-CNN】之 Dataset and Dataloader 代码…

Linux网络:传输层之UDPTCP协议

文章目录一、端口号1.端口号范围划分2.常用命令二、UDP 协议1.格式2.特点3. UDP 的缓冲区4. UDP 使用注意事项5.基于 UDP 的应用层协议三、TCP 协议1.格式2.确认应答机制3.超时重传机制4.连接管理机制三次握手四次挥手5.滑动窗口6.流量控制7.拥塞控制8.延迟应答9.捎带应答10.面…

PyQt5利用Qt Designer制作一个可以拖动获取文件信息的页面

前言 本篇在讲什么 用pyqt5制作一个简单的程序&#xff0c;拖动文件或脚本可以读取文件信息 本篇适合什么 适合初学PyQt5的小白 本篇需要什么 对Python语法有简单认知 对Qt有简单认知 依赖Pycharm编辑器 本篇的特色 具有全流程的图文教学 重实践&#xff0c;轻理论&…