QR decomposition and Givens Rotation (QR分解与Givens旋转)

在最近做的一个研究中,需要对 QR 分解进行更新,因此了解了一些关于 QR 分解和 Givens 旋转的内容。在这里进行总结。

QR 分解

所谓 QR 分解,就是将一个矩阵(可以不是方阵)分解成一个正交矩阵和一个上三角矩阵。即

A=QR

其中 Q 是正交矩阵,即 Q 中的列向量互相正交,即 QTQ=I R 是上三角矩阵。当 A 为非奇异矩阵时,这个分解是唯一的。

实现 QR 分解的算法有多种,包括 Gram–Schmidt 正交化,Householder 变换,以及 Givens 旋转。本文主要讨论用 Givens 旋转来实现的方法。关于 Gram–Schmidt 正交化实现的方法可以参看 QR Decomposition with Gram-Schmidt 。

Givens 旋转

Givens 旋转在数值计算中的主要作用在于将矩阵中的元素置换为0。具体来说,就是将原矩阵做成一个正交的 Givens 矩阵,然后将原矩阵特定位置上的元素变成0。下面以一个 2×2 矩阵的例子进行说明。

A=[1324]

在Givens 旋转一般考虑同一列中的两个元素,并通过左乘正交阵的方法把下方的元素变成0,针对上面的矩阵 A ,我们考虑第一列,并对 A 阵左乘一个正交阵,即

[0.31620.89440.89440.3162][1324]=[3.162304.42720.6325]

其中左乘的正交阵被称为 Givens 矩阵,具有形式:

G=[cosθsinθsinθcosθ]

在这里不详细讨论如何计算 Givens 矩阵,在 MATLAB 中可以直接调用 givens() 函数来进行计算。对于多维的矩阵,Givens 矩阵一般写作下面的形式。

G=10000cs00sc00001

QR 分解与 Givens 旋转

下面我们来说明如何通过 Givens 旋转 来实现 QR 分解。其实原理很简单,就是通过将原矩阵 A 的主对角线下方的元素都通过 Givens 旋转置换成0,形成上三角矩阵 R ,同时左乘的一系列 Givens 矩阵相乘得到一个正交阵 Q

可以通过下图来理解,其中 × 表示没有发生变化的元素, m 表示值改变的元素,每一个向右的箭头表示原矩阵左乘了一次 Givens 矩阵。

×××××××××m×0m×mm×mm00mm×mm×m00m×0m×m

即最终可以得到如下的形式:
QTA=R

从而得到

A=QR

相比于其他两种实现 QR 分解的方法,基于 Givens 选择的方法的优点在于其计算易于并行化,且在面对稀疏矩阵 (Sparse Matrix) 是可以减少计算量。

你可能感兴趣的:(优化算法)