4.6 QR分解二:Householder变换

news/2024/11/25 0:45:34/

1 Householder reflector

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

2 分解步骤

  首先把矩阵A按列向量分块,为(a1,a2,⋯,an)(a_1,a_2,\cdots,a_n)(a1,a2,,an),设单位矩阵的第一列为e1e_1e1,取uuu向量为以下向量:
u=a1−∥a1∥e1∥(a1−∥a1∥e1)∥u=\frac{a_1-\parallel a_1 \parallel e_1}{\parallel (a_1-\parallel a_1 \parallel e_1)\parallel} u=(a1a1e1)a1a1e1
  用这个uuu向量构造的Householder矩阵HHH会把a1a_1a1投影到e1e_1e1的方向上。也就是:
Ha1=∥a1∥e1Ha_1=\parallel a_1 \parallel e_1 Ha1=∥a1e1
  那么HAHAHA就是这个样子:
HA=H(a1,a2,⋯,an)=(∥a1∥⋯∗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,那么有:
HA=BH−1HA=H−1BA=H−1BHA=B\\ H^{-1}HA=H^{-1}B\\ A=H^{-1}B HA=BH1HA=H1BA=H1B
  Householder变换矩阵是自逆矩阵,也是对合矩阵,所以H=H−1H=H^{-1}H=H1.所以又有:
A=HBA=HB A=HB
  BBB矩阵的右下角,再当成新的子矩阵,继续完成这个过程,这样得到一系列的H矩阵,编号为H1,H2,⋯,HnH_1,H_2,\cdots,H_nH1,H2,,Hn.这写矩阵乘以AAA,得到的结果也是不断把对角线以下的元素变成000,所以最终结果就是上三角矩阵RRR。但是会发现这些Householder矩阵是不同阶的。为了同阶,可以在对角线上补1,凑成nnn阶矩阵,这种左上角补1的矩阵乘以任何矩阵不会改变左上角的元素。如下面这样处理:
H˜i=(11⋱Hi)n\~H_i=\begin{pmatrix}1 \\ & 1\\ & & \ddots\\ & & & H_i\end{pmatrix}_n H˜i=11Hin
  所以整个过程就是:
H˜nH˜n−1⋯H˜2H˜1A=RH˜1−1H˜2−1⋯H˜n−1−1H˜n−1H˜nH˜n−1⋯H˜2H˜1A=H˜1−1H˜2−1⋯H˜n−1−1H˜n−1RA=H˜1−1H˜2−1⋯H˜n−1−1H˜n−1RA=H˜1H˜2⋯H˜n−1H˜nR\~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
  最终这些拼凑为nnn阶的矩阵连乘起来,就是Q矩阵,最终的结果就是R矩阵。

3 举例

  以这个矩阵为例子:
(03104−2212)\begin{pmatrix}0 & 3 & 1\\ 0 & 4 & -2\\ 2 & 1 & 2\\ \end{pmatrix} 002341122
  第一次分解得到:
(03104−2212)=(001010100)(21204−2031)\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=001010100200143221
  第二次分解得到:
(21204−2031)=(10000.80.600.6−0.8)(21205−100−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.8200150212
  第三次分解得到:
(21205−100−2)=(10001000−1)(21205−1002)\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=100010001200150212

4 Python实现

  代码实现如下:

    @staticmethoddef 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] * ne1[0] = 1return 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() * 2return h# householder变换def householder(self, inner_product_matrix=None):n = len(self.__vectors)r = selfq = 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)# 左上角补1h_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 * rprint((h * r).to_latex(), '=',h.to_latex(), r.to_latex())# sub_r 的内容q = q * hreturn q, r

http://www.ppmy.cn/news/21571.html

相关文章

入职一年,那个准的下班的人,比我先升职了...

最近心态崩了。 和我同期一道进公司的人又升了一级,可是明明大家在进公司时,他不论是学历还是工作经验,样样都不如自己,眼下不过短短的两年时间便一跃在自己的职级之上,这着实让我有几分不甘心。 我想不明白&#xff…

明细打印重影方案

一、问题描述生产上出现明细查询打印业务,部分客户打印数据时出现数据重叠现象,不利于客户使用,影响客户体验。二、问题原因对方户名公司名称字段目前没有限制,按照现有的分页处理机制,如果一页纸出现多个公司名称较长…

什么是单体应用?什么是微服务?

Monolith(单体应用), 也称之为单体系统或者是 单体架构 。就是一种把系统中所有的功能、模块、组件等耦合在一个应用中应用最终打成一个(war,jar)包使用一个容器(Tomcat)进行部署,通常一个应用享用一个数据库。 也就是将所有的代码…

C语言进阶——字符函数和字符串函数(上)

目录 一、前言 二、正文 1.求字符串长度 ♥strlen 2.长度不受限制的字符串函数 ♥strcpy ♥strcat ♥strcmp 三、结语 一、前言 一日不见,如隔三秋;几日不见,甚是想念。猜想小伙伴们在平常进行有关字符的练习时遇到有关字符的操作却无从下手…

蓝桥杯STM32G431RBT6学习——M24C02

蓝桥杯STM32G431RBT6学习——M24C02 前言 IIC是单片机的通用协议,在蓝桥杯单片机、嵌入式中都是考点。国信长天开发板板载M24C02(IIC驱动)作为调电存储模块,可以通过IIC对其写入数据后,掉电进行保存以供读取。其硬件…

想成为数据分析师,看这里,数据分析必备的43个Excel函数

目录 前言 函数分类: 关联匹配类清洗处理类逻辑运算类计算统计类时间序列类 前言 Excel是我们工作中经常使用的一种工具,对于数据分析来说,这也是处理数据最基础的工具。 很多传统行业的数据分析师甚至只要掌握Excel和SQL即可。 对于初学者…

Android中级——滑动分析

SrcollAndroid坐标系视图坐标系常见方法实现滑动layout()offsetLeftAndRight()和offsetTopAndBottom()LayoutParamsscrollTo()与scrollBy()ScrollerVierDragHeplerAndroid坐标系 将屏幕左上角的顶点作为Android坐标系的原点,向右为X轴正方向,向下为Y轴正…

嵌入式开发:为什么物联网正在吞噬嵌入式操作系统?

在过去几年的嵌入式开发中,独立嵌入式软件市场的两大基石已被物联网公司完全吞噬。第一个FreeRTOS被亚马逊吞并,以支持其亚马逊Web服务(AWS)云平台的物联网开发,Express Logic被微软吞并,用于其竞争对手Azure云服务。许多分析师对…