在最近做的一個研究中,需要對 QR 分解進行更新,因此瞭解了一些關於 QR 分解和 Givens 旋轉的內容。在這裏進行總結。
QR 分解
所謂 QR 分解,就是將一個矩陣(可以不是方陣)分解成一個正交矩陣和一個上三角矩陣。即
其中
實現 QR 分解的算法有多種,包括 Gram–Schmidt 正交化,Householder 變換,以及 Givens 旋轉。本文主要討論用 Givens 旋轉來實現的方法。關於 Gram–Schmidt 正交化實現的方法可以參看 QR Decomposition with Gram-Schmidt 。
Givens 旋轉
Givens 旋轉在數值計算中的主要作用在於將矩陣中的元素置換爲0。具體來說,就是將原矩陣做成一個正交的 Givens 矩陣,然後將原矩陣特定位置上的元素變成0。下面以一個
在Givens 旋轉一般考慮同一列中的兩個元素,並通過左乘正交陣的方法把下方的元素變成0,針對上面的矩陣
其中左乘的正交陣被稱爲 Givens 矩陣,具有形式:
在這裏不詳細討論如何計算 Givens 矩陣,在 MATLAB 中可以直接調用 givens() 函數來進行計算。對於多維的矩陣,Givens 矩陣一般寫作下面的形式。
QR 分解與 Givens 旋轉
下面我們來說明如何通過 Givens 旋轉 來實現 QR 分解。其實原理很簡單,就是通過將原矩陣
可以通過下圖來理解,其中
即最終可以得到如下的形式:
從而得到
相比於其他兩種實現 QR 分解的方法,基於 Givens 選擇的方法的優點在於其計算易於並行化,且在面對稀疏矩陣 (Sparse Matrix) 是可以減少計算量。