3.3 QR分解 QR分解是将一个矩阵分解一个正交矩阵(酉矩阵)和一个三角矩阵的乘积. QR分解被广泛应用于线性最小二乘问题的求解和矩阵特征值的计算.
3.3.1 QR分解的存在性与唯一性 定理3.9 (QR分解) [73] 设 A ∈ C m × n A \in \mathbb{C}^{m \times n} A ∈ C m × n ( m ≥ n m \geq n m ≥ n ), 则存在一个单位列正交矩阵 Q ∈ C m × n Q \in \mathbb{C}^{m \times n} Q ∈ C m × n (即 Q ∗ Q = I n × n Q^{*}Q = I_{n \times n} Q ∗ Q = I n × n ) 和一个上三角矩阵 R ∈ C n × n R \in \mathbb{C}^{n \times n} R ∈ C n × n , 使得
A = Q R . (3.8) A = Q R. \tag {3.8} A = QR . ( 3.8 ) 若 A A A 列满秩, 则存在一个具有正对角线元素的上三角矩阵 R R R 使得 (3.8) 成立, 且此时 QR 分解唯一, 即 Q Q Q 和 R R R 都唯一.
证明. 设 A = [ a 1 , a 2 , … , a n ] ∈ C m × n A = [a_{1}, a_{2}, \ldots, a_{n}] \in \mathbb{C}^{m \times n} A = [ a 1 , a 2 , … , a n ] ∈ C m × n . 若 A A A 列满秩, 即 rank ( A ) = n \operatorname{rank}(A) = n rank ( A ) = n . 则 QR 分解 (3.8) 就是对 A A A 的列向量组进行 Gram-Schmidt 正交化过程的矩阵描述 (见算法 3.3).
算法3.3.Gram-Schmidt正交化过程 1: r 11 = ∥ a 1 ∥ 2 r_{11} = \left\| a_1\right\| _2 r 11 = ∥ a 1 ∥ 2 2: q 1 = a 1 / r 11 q_{1} = a_{1} / r_{11} q 1 = a 1 / r 11 3: for j = 2 j = 2 j = 2 to n n n do 4: q j = a j q_{j} = a_{j} q j = a j 5: for i = 1 i = 1 i = 1 to j − 1 j - 1 j − 1 do 6: r i j = ( a j , q i ) % r_{ij} = (a_j, q_i) \quad \% r ij = ( a j , q i ) % 计算内积, 用于正交化 7: q j = q j − r i j q i q_{j} = q_{j} - r_{ij}q_{i} q j = q j − r ij q i 8: end for 9: r j j = ∥ q j ∥ 2 r_{jj} = \| q_j\| _2 r jj = ∥ q j ∥ 2 10: q j = q j / r j j q_{j} = q_{j} / r_{jj} q j = q j / r jj 11: end for
由算法3.3可知
a 1 = r 11 q 1 , a j = r 1 j q 1 + r 2 j q 2 + ⋯ + r j j q j = [ q 1 , q 2 , … , q j ] [ r 1 j r 2 j ⋮ r j j ] , j = 2 , 3 , … , n . a _ {1} = r _ {1 1} q _ {1}, \quad a _ {j} = r _ {1 j} q _ {1} + r _ {2 j} q _ {2} + \dots + r _ {j j} q _ {j} = [ q _ {1}, q _ {2}, \ldots , q _ {j} ] \left[ \begin{array}{c} r _ {1 j} \\ r _ {2 j} \\ \vdots \\ r _ {j j} \end{array} \right], \quad j = 2, 3, \ldots , n. a 1 = r 11 q 1 , a j = r 1 j q 1 + r 2 j q 2 + ⋯ + r jj q j = [ q 1 , q 2 , … , q j ] r 1 j r 2 j ⋮ r jj , j = 2 , 3 , … , n . 记 Q = [ q 1 , q 2 , … , q n ] Q = [q_{1}, q_{2}, \ldots, q_{n}] Q = [ q 1 , q 2 , … , q n ] , R = [ r i j ] n × n R = [r_{ij}]_{n \times n} R = [ r ij ] n × n , 其中
r i j = { q i ∗ a j , f o r i ≤ j 0 , f o r i > j (3.9) r _ {i j} = \left\{ \begin{array}{l l} q _ {i} ^ {*} a _ {j}, & \text {f o r} i \leq j \\ 0, & \text {f o r} i > j \end{array} \right. \tag {3.9} r ij = { q i ∗ a j , 0 , f o r i ≤ j f o r i > j ( 3.9 ) 于是Gram-Schmidt正交化过程可表示为
[ a 1 , a 2 , … , a n ] = [ q 1 , q 2 , … , q n ] [ r 11 r 12 … r 1 n r 22 … r 2 n ⋱ r n − 1 , n r n n ] , 即 A = Q R . [ a _ {1}, a _ {2}, \ldots , a _ {n} ] = [ q _ {1}, q _ {2}, \ldots , q _ {n} ] \left[ \begin{array}{c c c c} {{r _ {1 1}}} & {{r _ {1 2}}} & {{\dots}} & {{r _ {1 n}}} \\ {} & {{r _ {2 2}}} & {{\dots}} & {{r _ {2 n}}} \\ {} & {} & {{\ddots}} & {{r _ {n - 1, n}}} \\ {} & {} & {} & {{r _ {n n}}} \end{array} \right], \quad \text {即} \quad A = Q R. [ a 1 , a 2 , … , a n ] = [ q 1 , q 2 , … , q n ] r 11 r 12 r 22 … … ⋱ r 1 n r 2 n r n − 1 , n r nn , 即 A = QR . 如果 A A A 不是列满秩, 我们可以通过下面的方式做类似的正交化过程:
如果 a 1 = 0 a_1 = 0 a 1 = 0 , 则令 q 1 = 0 q_1 = 0 q 1 = 0 ; 否则令 q 1 = a 1 / ∥ a 1 ∥ 2 q_1 = a_1 / \|a_1\|_2 q 1 = a 1 /∥ a 1 ∥ 2 ;
对于 j = 2 , 3 , … , n j = 2,3,\ldots ,n j = 2 , 3 , … , n ,计算 q ~ j = a j − ∑ i = 1 j − 1 ( q i ∗ a j ) q i \tilde{q}_j = a_j - \sum_{i = 1}^{j - 1}(q_i^* a_j)q_i q ~ j = a j − ∑ i = 1 j − 1 ( q i ∗ a j ) q i 如果 q ~ j = 0 \tilde{q}_j = 0 q ~ j = 0 ,则表明 a j a_{j} a j 可以由 a 1 , a 2 , … , a j − 1 a_1,a_2,\dots ,a_{j - 1} a 1 , a 2 , … , a j − 1 线性表出,令 q j = 0. q_{j} = 0. q j = 0. 否则令 q j = q ~ j / ∥ q ~ j ∥ 2 q_{j} = \tilde{q}_{j} / \| \tilde{q}_{j}\|_{2} q j = q ~ j /∥ q ~ j ∥ 2 :
于是我们有
其中 Q = [ q 1 , q 2 , … , q n ] Q = [q_{1}, q_{2}, \ldots, q_{n}] Q = [ q 1 , q 2 , … , q n ] 列正交 (但不是单位列正交), 其列向量要么是单位向量, 要么就是零向量. R = [ r i j ] n × n R = [r_{ij}]_{n \times n} R = [ r ij ] n × n 的定义同 (3.9). 需要注意的是, 如果 Q Q Q 的某一列 q k = 0 q_{k} = 0 q k = 0 , 那么 R R R 中对应的第 k k k 行就全部为 0.
设 rank ( A ) = l < n \operatorname{rank}(A) = l < n rank ( A ) = l < n ,则 Q Q Q 有 l l l 个非零列,设为 q i 1 , q i 2 , … , q i l q_{i_1}, q_{i_2}, \ldots, q_{i_l} q i 1 , q i 2 , … , q i l . 它们形成 C m \mathbb{C}^m C m 中的一个单位正交向量组,所以我们可以将其扩展成 C m \mathbb{C}^m C m 中的一组标准正交基,即
q i 1 , q i 2 , … , q i l , q ~ 1 , … , q ~ m − l . q _ {i _ {1}}, q _ {i _ {2}}, \dots , q _ {i _ {l}}, \tilde {q} _ {1}, \dots , \tilde {q} _ {m - l}. q i 1 , q i 2 , … , q i l , q ~ 1 , … , q ~ m − l . 然后我们用 q ~ 1 \tilde{q}_1 q ~ 1 替换 Q Q Q 中的第一个零列, 用 q ~ 2 \tilde{q}_2 q ~ 2 替换 Q Q Q 中的第二个零列, 依此类推, 将 Q Q Q 中的所有零列都替换掉. 将最后得到的矩阵记为 Q ~ \tilde{Q} Q ~ , 则 Q ~ ∈ C m × n \tilde{Q} \in \mathbb{C}^{m \times n} Q ~ ∈ C m × n 单位列正交, 且
Q ~ R = Q R . \tilde {Q} R = Q R. Q ~ R = QR . 这是由于 Q ~ \tilde{Q} Q ~ 中的新添加的列向量正好与 R R R 中的零行相对应. 所以我们有 QR 分解
A = Q ~ R . A = \tilde {Q} R. A = Q ~ R . 下面证明满秩矩阵QR分解的存在唯一性
存在性: 由于 A A A 列满秩, 由 Gram-Schmidt 正交化过程 (算法 3.3) 可知, 存在上三角矩阵 R = [ r i j ] n × n R = [r_{ij}]_{n \times n} R = [ r ij ] n × n 满足 r j j > 0 r_{jj} > 0 r jj > 0 , 使得 A = Q R A = QR A = QR , 其中 Q Q Q 单位列正交.
唯一性: 假设 A A A 存在 QR 分解
A = Q 1 R 1 = Q 2 R 2 , A = Q _ {1} R _ {1} = Q _ {2} R _ {2}, A = Q 1 R 1 = Q 2 R 2 , 其中 Q 1 , Q 2 ∈ C m × n Q_{1}, Q_{2} \in \mathbb{C}^{m \times n} Q 1 , Q 2 ∈ C m × n 单位列正交, R 1 , R 2 ∈ C n × n R_{1}, R_{2} \in \mathbb{C}^{n \times n} R 1 , R 2 ∈ C n × n 为具有正对角元素的上三角矩阵. 则有
Q 1 = Q 2 R 2 R 1 − 1 . (3.10) Q _ {1} = Q _ {2} R _ {2} R _ {1} ^ {- 1}. \tag {3.10} Q 1 = Q 2 R 2 R 1 − 1 . ( 3.10 ) 于是
1 = ∥ Q 1 ∥ 2 = ∥ Q 2 R 2 R 1 − 1 ∥ 2 = ∥ R 2 R 1 − 1 ∥ 2 . 1 = \| Q _ {1} \| _ {2} = \| Q _ {2} R _ {2} R _ {1} ^ {- 1} \| _ {2} = \| R _ {2} R _ {1} ^ {- 1} \| _ {2}. 1 = ∥ Q 1 ∥ 2 = ∥ Q 2 R 2 R 1 − 1 ∥ 2 = ∥ R 2 R 1 − 1 ∥ 2 . 又 R 1 , R 2 R_{1}, R_{2} R 1 , R 2 均为上三角矩阵, 所以 R 2 R 1 − 1 R_{2}R_{1}^{-1} R 2 R 1 − 1 也是上三角矩阵, 且其对角线元素为 R 2 ( i , i ) / R 1 ( i , i ) R_{2}(i,i) / R_{1}(i,i) R 2 ( i , i ) / R 1 ( i , i ) ,
i = 1 , 2 , … , n . i = 1,2,\dots ,n. i = 1 , 2 , … , n . 因此
R 2 ( i , i ) R 1 ( i , i ) ≤ ρ ( R 2 R 1 − 1 ) ≤ ∥ R 2 R 1 − 1 ∥ 2 ≤ 1 , i = 1 , 2 , … , n . \frac {R _ {2} (i , i)}{R _ {1} (i , i)} \leq \rho \left(R _ {2} R _ {1} ^ {- 1}\right) \leq \| R _ {2} R _ {1} ^ {- 1} \| _ {2} \leq 1, \quad i = 1, 2, \dots , n. R 1 ( i , i ) R 2 ( i , i ) ≤ ρ ( R 2 R 1 − 1 ) ≤ ∥ R 2 R 1 − 1 ∥ 2 ≤ 1 , i = 1 , 2 , … , n . 同理可证 R 1 ( i , i ) / R 2 ( i , i ) ≤ 1. R_{1}(i,i) / R_{2}(i,i)\leq 1. R 1 ( i , i ) / R 2 ( i , i ) ≤ 1. 所以
R 1 ( i , i ) = R 2 ( i , i ) , i = 1 , 2 , … , n . R _ {1} (i, i) = R _ {2} (i, i), \quad i = 1, 2, \dots , n. R 1 ( i , i ) = R 2 ( i , i ) , i = 1 , 2 , … , n . 又 ∥ Q 1 ∥ F 2 = t r ( Q 1 ∗ Q 1 ) = n , \| Q_1\| _F^2 = \mathrm{tr}(Q_1^* Q_1) = n, ∥ Q 1 ∥ F 2 = tr ( Q 1 ∗ Q 1 ) = n , 所以由(3.10)可知
∥ R 2 R 1 − 1 ∥ F 2 = ∥ Q 2 R 2 R 1 − 1 ∥ F 2 = ∥ Q 1 ∥ F 2 = n . \| R _ {2} R _ {1} ^ {- 1} \| _ {F} ^ {2} = \| Q _ {2} R _ {2} R _ {1} ^ {- 1} \| _ {F} ^ {2} = \| Q _ {1} \| _ {F} ^ {2} = n. ∥ R 2 R 1 − 1 ∥ F 2 = ∥ Q 2 R 2 R 1 − 1 ∥ F 2 = ∥ Q 1 ∥ F 2 = n . 由于 R 2 R 1 − 1 R_{2}R_{1}^{-1} R 2 R 1 − 1 的对角线元素都是1,所以 R 2 R 1 − 1 R_{2}R_{1}^{-1} R 2 R 1 − 1 只能是单位矩阵,即 R 2 = R 1 R_{2} = R_{1} R 2 = R 1 因此 Q 2 = A R 2 − 1 = Q_{2} = AR_{2}^{-1} = Q 2 = A R 2 − 1 = A R 1 − 1 = Q 1 AR_1^{-1} = Q_1 A R 1 − 1 = Q 1 ,即 A A A 的QR分解是唯一的. □
A 有时也将 QR 分解定义为: 存在酉矩阵 Q ∈ C m × m Q \in \mathbb{C}^{m \times m} Q ∈ C m × m 使得
其中 R = [ R 11 0 ] ∈ C m × n R = \left[ \begin{array}{c} R_{11} \\ 0 \end{array} \right] \in \mathbb{C}^{m \times n} R = [ R 11 0 ] ∈ C m × n 是上三角矩阵.
如果 A A A 是实矩阵, 则上面证明中的运算都可以在实数下进行, 因此 Q Q Q 和 R R R 都可以是实矩阵. 如果 A A A 是非奇异的方阵, 则 QR 分解也可以用来求解线性方程组 A x = b Ax = b A x = b .
Gram-Schmidt正交化与正交投影 Gram-Schmidt 正交化过程的第 j j j 步:
q ~ j = a j − r 1 j q 1 − r 2 j q 2 − ⋯ − r j − 1 , j q j − 1 \tilde {q} _ {j} = a _ {j} - r _ {1 j} q _ {1} - r _ {2 j} q _ {2} - \dots - r _ {j - 1, j} q _ {j - 1} q ~ j = a j − r 1 j q 1 − r 2 j q 2 − ⋯ − r j − 1 , j q j − 1 可以看作是 a j a_{j} a j 减去其在 span { q 1 , q 2 , … , q j − 1 } \operatorname{span}\{q_1, q_2, \ldots, q_{j-1}\} span { q 1 , q 2 , … , q j − 1 } 内的正交投影. 事实上, r i j q i r_{ij}q_i r ij q i 就是 a j a_{j} a j 在 q i q_i q i 方向的正交投影, 即
P s p a n { q i } a j = ( q i q i ⊺ ) a j = ( q i ⊺ a j ) q i = r i j q i . P _ {\mathrm {s p a n} \{q _ {i} \}} a _ {j} = (q _ {i} q _ {i} ^ {\intercal}) a _ {j} = (q _ {i} ^ {\intercal} a _ {j}) q _ {i} = r _ {i j} q _ {i}. P span { q i } a j = ( q i q i ⊺ ) a j = ( q i ⊺ a j ) q i = r ij q i . 下面给出QR分解的具体实现方法,分别基于MGS正交化过程, Householder变换和Givens变换.
3.3.2 基于MGS的QR分解 在证明QR分解的存在性时,我们利用了Gram-Schmidt正交化过程.但由于数值稳定性方面的原因,在实际计算中,我们一般不采用Gram-Schmidt正交化过程,取而代之的是修正的Gram-Schmidt正交化过程(modified Gram-Schmidt process,MGS),即对正交化过程做如下修改:
Gram-Schmidt 正交化过程的第 j j j 步:
(1) 计算 r i j = ( a j , q i ) r_{ij} = (a_j, q_i) r ij = ( a j , q i ) , i = 1 , 2 , … , j − 1 i = 1, 2, \ldots, j - 1 i = 1 , 2 , … , j − 1 ; (2) 计算 q ~ j = a j − r 1 j q 1 − r 2 j q 2 − ⋯ − r j − 1 , j q j − 1 ; \tilde{q}_j = a_j - r_{1j}q_1 - r_{2j}q_2 - \dots -r_{j - 1,j}q_{j - 1}; q ~ j = a j − r 1 j q 1 − r 2 j q 2 − ⋯ − r j − 1 , j q j − 1 ; (3) 计算 r j j = ∥ q ~ j ∥ r_{jj} = \|\tilde{q}_j\| r jj = ∥ q ~ j ∥ , q j = q ~ j / r j j q_j = \tilde{q}_j / r_{jj} q j = q ~ j / r jj ;
(1) 令 q ~ j = a j \tilde{q}_j = a_j q ~ j = a j (2) 计算 r i j = ( q ~ j , q i ) r_{ij} = (\tilde{q}_j, q_i) r ij = ( q ~ j , q i ) , q ~ j = q ~ j − r i j q i \tilde{q}_j = \tilde{q}_j - r_{ij}q_i q ~ j = q ~ j − r ij q i , i = 1 , 2 , … , j − 1 i = 1, 2, \ldots, j-1 i = 1 , 2 , … , j − 1 ; (3) 计算 r j j = ∥ q ~ j ∥ r_{jj} = \|\tilde{q}_j\| r jj = ∥ q ~ j ∥ , q j = q ~ j / r j j q_j = \tilde{q}_j / r_{jj} q j = q ~ j / r jj ;
可以证明, 数学上这两个算法完全等价, 即 r i j r_{ij} r ij 和 q j q_j q j 都一样. 但在数值上, Gram-Schmidt 正交化过程是不稳定的, 而 MGS 是向后稳定的 [98].
算法3.4.基于MGS的QR分解 % \% % Given A ∈ C m × n A \in \mathbb{C}^{m \times n} A ∈ C m × n , compute Q = [ q 1 , … , q n ] ∈ R m × n Q = [q_1, \ldots, q_n] \in \mathbb{R}^{m \times n} Q = [ q 1 , … , q n ] ∈ R m × n and R ∈ R n × n R \in \mathbb{R}^{n \times n} R ∈ R n × n such that A = Q R A = QR A = QR
1: Set R = [ r i j ] = 0 n × n R = [r_{ij}] = 0_{n \times n} R = [ r ij ] = 0 n × n (the n × n n \times n n × n zero matrix) 2: if a 1 = 0 a_1 = 0 a 1 = 0 then 3: q 1 = 0 q_{1} = 0 q 1 = 0 4: else 5: r 11 = ∥ a 1 ∥ 2 , q 1 = a 1 / ∥ a 1 ∥ 2 r_{11} = \| a_1\| _2, \quad q_1 = a_1 / \| a_1\| _2 r 11 = ∥ a 1 ∥ 2 , q 1 = a 1 /∥ a 1 ∥ 2 6: end if 7: for j = 2 j = 2 j = 2 to n n n do 8: q j = a j q_{j} = a_{j} q j = a j 9: for i = 1 i = 1 i = 1 to j − 1 j - 1 j − 1 do % \% % MGS, 注意与 GS 的区别 10: r i j = ( q j , q i ) , q j = q j − r i j q i r_{ij} = (q_j,q_i),\quad q_j = q_j - r_{ij}q_i r ij = ( q j , q i ) , q j = q j − r ij q i 11: end for 12: if q j ≠ 0 q_{j}\neq 0 q j = 0 then 13: r j j = ∥ q j ∥ 2 , q j = q j / r j j r_{jj} = \| q_j\| _2, \quad q_j = q_j / r_{jj} r jj = ∥ q j ∥ 2 , q j = q j / r jj 14: end if 15: end for
A 本算法的运算量大约为 2 m n 2 2mn^{2} 2 m n 2 算法中 R R R 是一列一列计算的, 因此也称为按列MGS (column-oriented MGS). 按列MGS不适合列主元, 因此, 如果需要计算列主元QR时需采用按行MGS (row-oriented MGS), 可参见相关资料. 由MGS得到的QR分解中, Q ∈ R m × n , R ∈ R n × n Q\in \mathbb{R}^{m\times n},R\in \mathbb{R}^{n\times n} Q ∈ R m × n , R ∈ R n × n
3.3.3 基于Householder变换的QR分解 由定理3.5可知, 通过Householder变换, 我们可以将任何一个非零变量 x ∈ R n x \in \mathbb{R}^n x ∈ R n 转化成 ∥ x ∥ 2 e 1 \| x\|_2e_1 ∥ x ∥ 2 e 1 , 即除第一个元素外, 其它都为零. 下面我们就考虑通过Householder变换来实现矩阵的QR分解.
设 A ∈ R m × n A \in \mathbb{R}^{m \times n} A ∈ R m × n ( m ≥ n m \geq n m ≥ n ), 构造 Householder 变换 H 1 ∈ R m × m H_1 \in \mathbb{R}^{m \times m} H 1 ∈ R m × m , 使得
H 1 [ a 11 a 21 ⋮ a m 1 ] = [ r 1 0 ⋮ 0 ] . H _ {1} \left[ \begin{array}{c} a _ {1 1} \\ a _ {2 1} \\ \vdots \\ a _ {m 1} \end{array} \right] = \left[ \begin{array}{c} r _ {1} \\ 0 \\ \vdots \\ 0 \end{array} \right]. H 1 a 11 a 21 ⋮ a m 1 = r 1 0 ⋮ 0 . 于是
H 1 A = [ r 1 a ~ 12 … a ~ 1 n 0 ⋮ A ~ 2 0 ] , H _ {1} A = \left[ \begin{array}{c c c c} r _ {1} & \tilde {a} _ {1 2} & \dots & \tilde {a} _ {1 n} \\ \hline 0 & & \\ \vdots & & \tilde {A} _ {2} \\ 0 & & \end{array} \right], H 1 A = r 1 0 ⋮ 0 a ~ 12 … A ~ 2 a ~ 1 n , 其中 A ~ 2 ∈ R ( m − 1 ) × ( n − 1 ) \tilde{A}_2\in \mathbb{R}^{(m - 1)\times (n - 1)} A ~ 2 ∈ R ( m − 1 ) × ( n − 1 ) .同样地,我们可以构造一个Householder变换 H ~ 2 ∈ R ( m − 1 ) × ( m − 1 ) \tilde{H}_2\in \mathbb{R}^{(m - 1)\times (m - 1)} H ~ 2 ∈ R ( m − 1 ) × ( m − 1 ) ,将 A ~ 2 \tilde{A}_2 A ~ 2 的第一列中除第一个元素外的所有元素都化为0,即
H ~ 2 A ~ 2 = [ r 2 a ~ 23 … a ~ 2 n 0 ⋮ A ~ 3 0 ] . \tilde {H} _ {2} \tilde {A} _ {2} = \left[ \begin{array}{c c c c} r _ {2} & \tilde {a} _ {2 3} & \dots & \tilde {a} _ {2 n} \\ \hline 0 & & \\ \vdots & & \tilde {A} _ {3} \\ 0 & & \end{array} \right]. H ~ 2 A ~ 2 = r 2 0 ⋮ 0 a ~ 23 … A ~ 3 a ~ 2 n . 令 H 2 = [ 1 0 0 H ~ 2 ] H_{2} = \left[ \begin{array}{cc}1 & 0\\ 0 & \tilde{H}_{2} \end{array} \right] H 2 = [ 1 0 0 H ~ 2 ] 则 H 2 ∈ R m × m H_{2}\in \mathbb{R}^{m\times m} H 2 ∈ R m × m 也是Householder变换(见习题3.8),且
H 2 H 1 A = [ r 1 a ~ 12 a ~ 13 … a ~ 1 n 0 r 2 a ~ 23 … a ~ 2 n 0 0 ⋮ ⋮ A ~ 3 0 0 ] . H _ {2} H _ {1} A = \left[ \begin{array}{c c c c c} r _ {1} & \tilde {a} _ {1 2} & \tilde {a} _ {1 3} & \dots & \tilde {a} _ {1 n} \\ 0 & r _ {2} & \tilde {a} _ {2 3} & \dots & \tilde {a} _ {2 n} \\ \hline 0 & 0 & & & \\ \vdots & \vdots & & \tilde {A} _ {3} \\ 0 & 0 & & & \end{array} \right]. H 2 H 1 A = r 1 0 0 ⋮ 0 a ~ 12 r 2 0 ⋮ 0 a ~ 13 a ~ 23 … … A ~ 3 a ~ 1 n a ~ 2 n . 不断重复上述过程, 我们就可以得到一系列的 Householder 变换
H k = [ I k − 1 0 0 H ~ k ] , H ~ k ∈ R ( n + 1 − k ) × ( n + 1 − k ) , k = 1 , 2 , … , n , H _ {k} = \left[ \begin{array}{c c} I _ {k - 1} & 0 \\ 0 & \tilde {H} _ {k} \end{array} \right], \quad \tilde {H} _ {k} \in \mathbb {R} ^ {(n + 1 - k) \times (n + 1 - k)}, \quad k = 1, 2, \ldots , n, H k = [ I k − 1 0 0 H ~ k ] , H ~ k ∈ R ( n + 1 − k ) × ( n + 1 − k ) , k = 1 , 2 , … , n , 使得
H n … H 2 H 1 A = [ r 1 a ~ 12 … a ~ 1 n 0 r 2 … a ~ 2 n ⋮ ⋱ ⋮ 0 0 … r n 0 0 … 0 ⋮ ⋮ ⋮ 0 0 … 0 ] ≜ R . H _ {n} \dots H _ {2} H _ {1} A = \left[ \begin{array}{c c c c} r _ {1} & \tilde {a} _ {1 2} & \dots & \tilde {a} _ {1 n} \\ 0 & r _ {2} & \dots & \tilde {a} _ {2 n} \\ \vdots & & \ddots & \vdots \\ 0 & 0 & \dots & r _ {n} \\ 0 & 0 & \dots & 0 \\ \vdots & \vdots & & \vdots \\ 0 & 0 & \dots & 0 \end{array} \right] \triangleq R. H n … H 2 H 1 A = r 1 0 ⋮ 0 0 ⋮ 0 a ~ 12 r 2 0 0 ⋮ 0 … … ⋱ … … … a ~ 1 n a ~ 2 n ⋮ r n 0 ⋮ 0 ≜ R . 由于Householder变换都是正交矩阵,令
Q ≜ ( H n … H 2 H 1 ) − 1 = H 1 − 1 H 2 − 1 … H n − 1 = H 1 H 2 … H n , Q \triangleq \left(H _ {n} \dots H _ {2} H _ {1}\right) ^ {- 1} = H _ {1} ^ {- 1} H _ {2} ^ {- 1} \dots H _ {n} ^ {- 1} = H _ {1} H _ {2} \dots H _ {n}, Q ≜ ( H n … H 2 H 1 ) − 1 = H 1 − 1 H 2 − 1 … H n − 1 = H 1 H 2 … H n , 则 Q Q Q 也是正交矩阵,且
A = ( H n − 1 ⋅ ⋅ ⋅ H 2 H 1 ) − 1 R = Q R . A = (H _ {n - 1} \cdot \cdot \cdot H _ {2} H _ {1}) ^ {- 1} R = Q R. A = ( H n − 1 ⋅ ⋅ ⋅ H 2 H 1 ) − 1 R = QR . 以上就是基于Householder变换的QR分解的具体实现过程.最后所得到的上三角矩阵 R R R 就存放在 A A A 的上三角部分.
如果不需要生成 Q Q Q , 则基于 Householder 变换的 QR 分解的运算量大约为 2 m n 2 − 2 n 3 / 3 2mn^{2} - 2n^{3}/3 2 m n 2 − 2 n 3 /3 .
矩阵 Q Q Q 可通过下面的累积方法来计算:
{ Q = I m , Q = Q H k , k = 1 , 2 , … , n . \left\{ \begin{array}{l} Q = I _ {m}, \\ Q = Q H _ {k}, \quad k = 1, 2, \ldots , n. \end{array} \right. { Q = I m , Q = Q H k , k = 1 , 2 , … , n . 如果保留了每一步的Householder向量, 则 Q Q Q 也可以通过下面的向后累积方法来计算:
Q = H k Q , k = n , n − 1 , … , 1. Q = H _ {k} Q, \quad k = n, n - 1, \dots , 1. Q = H k Q , k = n , n − 1 , … , 1. 这样做的好处是一开始 Q Q Q 会非常稀疏 (左上角为单位矩阵), 随着迭代的进行, Q Q Q 才会慢慢变满. 而前面的计算方法, 第一步就将 Q Q Q 变成了一个满矩阵.
采用向后累积方法计算 Q Q Q 的运算量大约为 4 m 2 n − 4 m n 2 + 4 n 3 / 3 4m^{2}n - 4mn^{2} + 4n^{3} / 3 4 m 2 n − 4 m n 2 + 4 n 3 /3 . 如果只需要计算 Q Q Q 的前 n n n 列, 则运算量大约为 2 m n 2 − 2 n 3 / 3 2mn^{2} - 2n^{3} / 3 2 m n 2 − 2 n 3 /3 , 此时 QR 分解的总运算量为 4 m n 2 − 4 n 3 / 3 4mn^{2} - 4n^{3} / 3 4 m n 2 − 4 n 3 /3 . 若 m = n m = n m = n , 则为 8 n 3 / 3 8n^{3} / 3 8 n 3 /3 .
算法3.5.基于Householder变换的QR分解 % \% % Given A ∈ R m × n A \in \mathbb{R}^{m \times n} A ∈ R m × n , compute Q Q Q and R R R such that A = Q R A = QR A = QR where Q ∈ R m × m Q \in \mathbb{R}^{m \times m} Q ∈ R m × m and R ∈ R m × n R \in \mathbb{R}^{m \times n} R ∈ R m × n .% \% % The upper triangular part of R R R is stored in the upper triangular part of A A A
1: Set Q = I m × m Q = I_{m \times m} Q = I m × m 2: for k = 1 k = 1 k = 1 to n n n do 3: x = A ( k : m , k ) x = A(k:m,k) x = A ( k : m , k ) 4: [ β k , v k ] = H o u s e ( x ) [\beta_k, v_k] = \mathbf{House}(x) [ β k , v k ] = House ( x ) 5: A ( k : m , k : n ) = ( I m − k + 1 − β k v k v k ⊤ ) A ( k : m , k : n ) A(k:m,k:n) = (I_{m - k + 1} - \beta_kv_kv_k^\top)A(k:m,k:n) A ( k : m , k : n ) = ( I m − k + 1 − β k v k v k ⊤ ) A ( k : m , k : n ) 6: = A ( k : m , k : n ) − β k v k ( v k T A ( k : m , k : n ) ) = A(k:m,k:n) - \beta_{k}v_{k}\big(v_{k}^{\mathsf{T}}A(k:m,k:n)\big) = A ( k : m , k : n ) − β k v k ( v k T A ( k : m , k : n ) ) 7: Q ( : , k : m ) = Q ( : , k : m ) ( I m − k + 1 − β k v k v k ⊤ ) Q(:, k : m) = Q(:, k : m)(I_{m-k+1} - \beta_k v_k v_k^\top) Q ( : , k : m ) = Q ( : , k : m ) ( I m − k + 1 − β k v k v k ⊤ ) 8: = Q ( : , k : m ) − β k ( Q ( : , k : m ) v k ) v k T = Q(:,k:m) - \beta_{k}\big(Q(:,k:m)v_{k}\big)v_{k}^{\mathsf{T}} = Q ( : , k : m ) − β k ( Q ( : , k : m ) v k ) v k T 9: end for
上面的算法只是关于Householder QR分解的一个简单描述,并没有考虑运算量问题.在实际计算时,我们通常会保留所有的Householder向量(用于向后累积法计算 Q Q Q ).由于第 k k k 步中 H ~ k \tilde{H}_k H ~ k 所对应的Householder向量 v k v_{k} v k 的长度为 m − k + 1 m - k + 1 m − k + 1 ,因此我们先把 v k v_{k} v k 单位化,使得 v k v_{k} v k 的第一元素为1,这样就只要存储 v k ( 2 : e n d ) v_{k}(2:end) v k ( 2 : e n d ) ,共 m − k m - k m − k 个元素.于是我们就可以把所有的
Householder 向量存放在 A A A 的严格下三角部分. 而 A A A 的上三角部分仍然存放 R R R .
事实上, 如果没有明确要求生成 Q Q Q , 通常只需存储 v k v_{k} v k 和 β k \beta_{k} β k , 即以因式分解 (Factored-Form) 形式存储 Q Q Q [57].
我们也可以考虑块Householder QR分解,以便充分利用3级BLAS运算,提高计算效率. 算法3.5针对的是实矩阵,如果是复矩阵则要适当做些修改
3.3.4 列主元QR分解 如果 A A A 不是满秩, 记 l ≜ rank ( A ) < n l \triangleq \operatorname{rank}(A) < n l ≜ rank ( A ) < n , 则存在一个置换矩阵 P P P , 使得 A P AP A P 的前 l l l 列是线性无关的. 因此我们可以对 A P AP A P 进行 QR 分解, 于是我们可以得到下面的结论.
定理3.10 (列主元QR分解) 设 A ∈ C m × n A \in \mathbb{C}^{m \times n} A ∈ C m × n ( m ≥ n m \geq n m ≥ n ), 且 rank ( A ) = l < n \operatorname{rank}(A) = l < n rank ( A ) = l < n . 则存在置换矩阵 P P P 和正交矩阵 Q ∈ C m × m Q \in \mathbb{C}^{m \times m} Q ∈ C m × m , 使得
A P = Q [ R 11 R 12 0 0 ] m × n , A P = Q \left[ \begin{array}{c c} R _ {1 1} & R _ {1 2} \\ 0 & 0 \end{array} \right] _ {m \times n}, A P = Q [ R 11 0 R 12 0 ] m × n , 其中 R 11 ∈ C l × l R_{11}\in \mathbb{C}^{l\times l} R 11 ∈ C l × l 是非奇异上三角矩阵,且对角线元素满足 r 11 ≥ r 22 ≥ ⋯ ≥ r l l > 0 r_{11}\geq r_{22}\geq \dots \geq r_{ll} > 0 r 11 ≥ r 22 ≥ ⋯ ≥ r ll > 0
A 上述结论也可简化为
A P = Q 1 [ R 11 R 12 ] , A P = Q _ {1} \left[ \begin{array}{c c} R _ {1 1} & R _ {1 2} \end{array} \right], A P = Q 1 [ R 11 R 12 ] , 其中 Q 1 ∈ C m × l Q_{1}\in \mathbb{C}^{m\times l} Q 1 ∈ C m × l 单位列正交(上述结论中 Q Q Q 的前 l l l 列).
列主元QR分解的实现过程与QR分解基本类似,只是在第 k k k 步时,需要选列主元,同时可能需要做一个列交换.
假设经过 k − 1 k - 1 k − 1 步后,我们得到下面的分解
A P ( k − 1 ) = Q ( k − 1 ) [ R 11 ( k − 1 ) R 12 ( k − 1 ) 0 R 22 ( k − 1 ) ] ≜ Q ( k − 1 ) R ( k − 1 ) , 即 ( Q ( k − 1 ) ) T A P ( k − 1 ) = R ( k − 1 ) , A P ^ {(k - 1)} = Q ^ {(k - 1)} \left[ \begin{array}{c c} {{R _ {1 1} ^ {(k - 1)}}} & {{R _ {1 2} ^ {(k - 1)}}} \\ {{0}} & {{R _ {2 2} ^ {(k - 1)}}} \end{array} \right] \triangleq Q ^ {(k - 1)} R ^ {(k - 1)}, \quad \text {即} \quad \left(Q ^ {(k - 1)}\right) ^ {\mathsf {T}} A P ^ {(k - 1)} = R ^ {(k - 1)}, A P ( k − 1 ) = Q ( k − 1 ) [ R 11 ( k − 1 ) 0 R 12 ( k − 1 ) R 22 ( k − 1 ) ] ≜ Q ( k − 1 ) R ( k − 1 ) , 即 ( Q ( k − 1 ) ) T A P ( k − 1 ) = R ( k − 1 ) , 其中 P ( k − 1 ) P^{(k - 1)} P ( k − 1 ) 是置换矩阵, Q ( k − 1 ) Q^{(k - 1)} Q ( k − 1 ) 是正交矩阵, R 11 ( k − 1 ) ∈ R ( k − 1 ) × ( k − 1 ) R_{11}^{(k - 1)}\in \mathbb{R}^{(k - 1)\times (k - 1)} R 11 ( k − 1 ) ∈ R ( k − 1 ) × ( k − 1 ) 是非奇异上三角矩阵
下面考虑第 k k k 步:
(1) 首先计算 R 22 ( k − 1 ) R_{22}^{(k - 1)} R 22 ( k − 1 ) 的所有列的范数, 如果范数都为0, 则 R 22 ( k − 1 ) = 0 R_{22}^{(k - 1)} = 0 R 22 ( k − 1 ) = 0 , 此时必有 k − 1 = l k - 1 = l k − 1 = l , 算法结束. (2) 当 k ≤ l k \leq l k ≤ l 时, R 22 ( k − 1 ) ≠ 0 R_{22}^{(k-1)} \neq 0 R 22 ( k − 1 ) = 0 , 记其范数最大的列为第 i k i_k i k 列 (如果有相等的, 取其中一个即可). 若 i k ≠ 1 i_k \neq 1 i k = 1 , 则交换 R ( k − 1 ) R^{(k-1)} R ( k − 1 ) 的第 k k k 列与第 i k + k − 1 i_k + k - 1 i k + k − 1 列, 并记相应的置换矩阵为 P k P_k P k . (3) 由于列交换不会影响到 R ( k − 1 ) R^{(k - 1)} R ( k − 1 ) 的前 k − 1 k - 1 k − 1 列, 因此列交换后的矩阵可记为
R ( k − 1 ) P k ≜ [ R 11 ( k − 1 ) R ~ 12 ( k − 1 ) 0 R ~ 22 ( k − 1 ) ] . R ^ {(k - 1)} P _ {k} \triangleq \left[ \begin{array}{c c} R _ {1 1} ^ {(k - 1)} & \tilde {R} _ {1 2} ^ {(k - 1)} \\ 0 & \tilde {R} _ {2 2} ^ {(k - 1)} \end{array} \right]. R ( k − 1 ) P k ≜ [ R 11 ( k − 1 ) 0 R ~ 12 ( k − 1 ) R ~ 22 ( k − 1 ) ] . 构造 R ~ 22 ( k − 1 ) \tilde{R}_{22}^{(k - 1)} R ~ 22 ( k − 1 ) 的第1列所对应的Householder变换 H ~ k \tilde{H}_k H ~ k ,并令 H k = [ I k − 1 0 0 H ~ k ] , P ( k ) = P ( k − 1 ) P k , H_{k} = \left[ \begin{array}{cc}I_{k - 1} & 0\\ 0 & \tilde{H}_{k} \end{array} \right],P^{(k)} = P^{(k - 1)}P_k, H k = [ I k − 1 0 0 H ~ k ] , P ( k ) = P ( k − 1 ) P k , 于是
H k ( Q ( k − 1 ) ) T A P ( k ) = H k R ( k − 1 ) P k = [ R 11 ( k − 1 ) R ~ 12 ( k − 1 ) 0 H ~ k R ~ 22 ( k − 1 ) ] ≜ R ( k ) , H _ {k} \left(Q ^ {(k - 1)}\right) ^ {\mathsf {T}} A P ^ {(k)} = H _ {k} R ^ {(k - 1)} P _ {k} = \left[ \begin{array}{c c} R _ {1 1} ^ {(k - 1)} & \tilde {R} _ {1 2} ^ {(k - 1)} \\ 0 & \tilde {H} _ {k} \tilde {R} _ {2 2} ^ {(k - 1)} \end{array} \right] \triangleq R ^ {(k)}, H k ( Q ( k − 1 ) ) T A P ( k ) = H k R ( k − 1 ) P k = [ R 11 ( k − 1 ) 0 R ~ 12 ( k − 1 ) H ~ k R ~ 22 ( k − 1 ) ] ≜ R ( k ) , 其中 H ~ k R ~ 22 ( k − 1 ) \tilde{H}_k\tilde{R}_{22}^{(k - 1)} H ~ k R ~ 22 ( k − 1 ) 的第一列除第一个元素外, 其余都是零, 且该元素的值等于 R ~ 22 ( k − 1 ) \tilde{R}_{22}^{(k - 1)} R ~ 22 ( k − 1 ) 的第1列的范数. 记 Q ( k ) ≜ Q ( k − 1 ) H k T Q^{(k)}\triangleq Q^{(k - 1)}H_k^{\mathsf{T}} Q ( k ) ≜ Q ( k − 1 ) H k T , 则
A P ( k ) = Q ( k ) R ( k ) = [ R 11 ( k ) R 12 ( k ) 0 R 22 ( k ) ] , A P ^ {(k)} = Q ^ {(k)} R ^ {(k)} = \left[ \begin{array}{c c} R _ {1 1} ^ {(k)} & R _ {1 2} ^ {(k)} \\ 0 & R _ {2 2} ^ {(k)} \end{array} \right], A P ( k ) = Q ( k ) R ( k ) = [ R 11 ( k ) 0 R 12 ( k ) R 22 ( k ) ] , 其中 R 11 ( k ) ∈ R k × k R_{11}^{(k)}\in \mathbb{R}^{k\times k} R 11 ( k ) ∈ R k × k 为非奇异上三角矩阵
依此类推, 直到第 l l l 步, 我们就可以得到 A A A 的列主元 QR 分解, 其中 R 11 R_{11} R 11 的对角线元素非负且按降序排列是由列主元的选取方法和 Householder 变换的性质得到的.
下面是列主元 QR 分解的一个应用.
推论3.11 (满秩分解) 设 A ∈ C m × n A \in \mathbb{C}^{m \times n} A ∈ C m × n 且 rank ( A ) = r ≤ min { m , n } \operatorname{rank}(A) = r \leq \min\{m, n\} rank ( A ) = r ≤ min { m , n } , 则存在满秩矩阵 F ∈ C m × r F \in \mathbb{C}^{m \times r} F ∈ C m × r 和 G ∈ C r × n G \in \mathbb{C}^{r \times n} G ∈ C r × n , 使得
3.3.5 基于Givens变换的QR分解 我们同样可以利用Givens变换来做QR分解
设 A ∈ R n × n A \in \mathbb{R}^{n \times n} A ∈ R n × n , 首先构造一个Givens变换 G 21 G_{21} G 21 , 作用在 A A A 的最前面的两行上, 使得
G 21 [ a 11 a 21 a 31 ⋮ a n 1 ] = [ a ~ 11 0 a 31 ⋮ a n 1 ] . G _ {2 1} \left[ \begin{array}{c} a _ {1 1} \\ a _ {2 1} \\ a _ {3 1} \\ \vdots \\ a _ {n 1} \end{array} \right] = \left[ \begin{array}{c} \tilde {a} _ {1 1} \\ 0 \\ a _ {3 1} \\ \vdots \\ a _ {n 1} \end{array} \right]. G 21 a 11 a 21 a 31 ⋮ a n 1 = a ~ 11 0 a 31 ⋮ a n 1 . 由于 G 21 G_{21} G 21 只改变矩阵的第1行和第2行的值, 所以其它行保存不变. 然后再构造一个Givens变换 G 31 G_{31} G 31 , 作用在 G 21 A G_{21}A G 21 A 的第1行和第3行, 将其第一列的第三个元素化为零. 由于 G 31 G_{31} G 31 只改变矩阵的第1行和第3行的值, 所以第二行的零元素维持不变. 以此类推, 我们可以构造一系列的Givens变换 G 41 , G 51 , … , G n 1 G_{41}, G_{51}, \ldots, G_{n1} G 41 , G 51 , … , G n 1 , 使得 G n 1 ⋯ G 21 A G_{n1} \cdots G_{21}A G n 1 ⋯ G 21 A 的第一列中除第一个元素外, 其它元素都化为零, 即
G n 1 … G 21 A = [ ∗ ∗ … ∗ 0 ∗ … ∗ ⋮ ⋮ ⋮ 0 ∗ … ∗ ] . G _ {n 1} \dots G _ {2 1} A = \left[ \begin{array}{c c c c} * & * & \dots & * \\ 0 & * & \dots & * \\ \vdots & \vdots & & \vdots \\ 0 & * & \dots & * \end{array} \right]. G n 1 … G 21 A = ∗ 0 ⋮ 0 ∗ ∗ ⋮ ∗ … … … ∗ ∗ ⋮ ∗ . 下面我们可以对第二列进行类似的处理.构造Givens变换 G 32 , G 42 , … , G n 2 G_{32},G_{42},\ldots ,G_{n2} G 32 , G 42 , … , G n 2 ,将第二列的第3至第 n _n n 个元素全化为零,同时保持第一列不变
以此类推, 我们对其他列也做类似的处理. 最后, 通过构造 1 2 n ( n − 1 ) \frac{1}{2} n(n - 1) 2 1 n ( n − 1 ) 个Givens变换, 将 A A A 转
化成一个上三角矩阵 R R R ,即
R = G n , n − 1 … G 21 A . R = G _ {n, n - 1} \dots G _ {2 1} A. R = G n , n − 1 … G 21 A . 令 Q = ( G n , n − 1 … G 21 ) T Q = (G_{n,n - 1}\dots G_{21})^{\mathsf{T}} Q = ( G n , n − 1 … G 21 ) T .由于Givens变换是正交矩阵,所以 Q Q Q 也是正交矩阵.于是,我们就得到矩阵 A A A 的QR分解
与Householder变换一样,在进行Givens变换时,我们不需要显式地写出Givens矩阵.
对于稠密矩阵而言, 基于Givens变换的QR分解的运算量比Householder变换要多很多. 当需要连续应用一系列Givens变换时,我们可以使用快速Givens变换(见[16]).但即便如此,其速度仍然要慢于Householder变换.因此基于Givens变换的QR分解主要用于当矩阵的非零下三角元素相对较少时的情形(比如对上Hessenberg矩阵进行QR分解),或者稀疏矩阵(可以尽可能地保留矩阵的稀疏性). A 另外, 由于每次 Givens 变换只影响矩阵的两行或者两列, 因此非常适合并行计算. 如果 A ∈ R m × n A \in \mathbb{R}^{m \times n} A ∈ R m × n , 其中 m > n m > n m > n , 我们仍然可以通过Givens变换进行QR分解.
下面是基于Givens变换的QR分解的算法描述
算法3.6.基于Givens变换的QR分解 % \% % Given A ∈ R m × n A \in \mathbb{R}^{m \times n} A ∈ R m × n , compute Q Q Q and R R R such that A = Q R A = QR A = QR where Q ∈ R m × m Q \in \mathbb{R}^{m \times m} Q ∈ R m × m and R ∈ R m × n R \in \mathbb{R}^{m \times n} R ∈ R m × n .
% \% % The upper triangular part of R R R is stored in the upper triangular part of A A A
1: Set Q = I m × m Q = I_{m \times m} Q = I m × m 2: for k = 1 k = 1 k = 1 to n n n do 3: for i = k + 1 i = k + 1 i = k + 1 to m m m do 4: [ c , s ] = givens ( a k k , a i k ) [c, s] = \text{givens}(a_{kk}, a_{ik}) [ c , s ] = givens ( a kk , a ik ) 5: [ A ( k , k : n ) A ( i , k : n ) ] = G [ A ( k , k : n ) A ( i , k : n ) ] \begin{bmatrix} A(k,k:n)\\ A(i,k:n) \end{bmatrix} = G\begin{bmatrix} A(k,k:n)\\ A(i,k:n) \end{bmatrix} [ A ( k , k : n ) A ( i , k : n ) ] = G [ A ( k , k : n ) A ( i , k : n ) ] where G = [ c s − s c ] G = \begin{bmatrix} c & s\\ -s & c \end{bmatrix} G = [ c − s s c ] 6: [ Q ( 1 : m , k ) , Q ( 1 : m , i ) ] = [ Q ( 1 : m , k ) , Q ( 1 : m , i ) ] G T [Q(1:m,k),Q(1:m,i)] = [Q(1:m,k),Q(1:m,i)]G^{\mathsf{T}} [ Q ( 1 : m , k ) , Q ( 1 : m , i )] = [ Q ( 1 : m , k ) , Q ( 1 : m , i )] G T 7: end for 8: end for
3.3.6 QR分解的稳定性 基于Householder变换和Givens变换的QR分解都具有很好的数值稳定性.详细分析可以参考[135]和[70].基于MGS的QR分解也是向后稳定的,参见[98].
当需要计算矩阵 Q Q Q 时, 基于MGS的QR分解的运算量相对较少. 因此当 A A A 的列向量具有很好的线性无关性时, 我们可以使用MGS来计算QR分解. 但需要注意的是, MGS得到的 Q Q Q 不是方阵, 除非 A A A 是方阵.
但是, 由于舍入误差的原因, 最后得到的矩阵 Q Q Q 会带有一定的误差, 可能会导致 Q Q Q 失去正交性. Björck [15, 88] 证明了, 通过 MGS 计算的矩阵 Q Q Q 满足
Q T Q = I + E M G S 其 中 ∥ E M G S ∥ 2 = c 1 ( m , n ) ε u κ 2 ( A ) 1 − c 1 ( m , n ) ε u κ 2 ( A ) , Q ^ {\mathsf {T}} Q = I + E _ {M G S} \quad \text {其 中} \quad \| E _ {M G S} \| _ {2} = \frac {c _ {1} (m , n) \varepsilon_ {u} \kappa_ {2} (A)}{1 - c _ {1} (m , n) \varepsilon_ {u} \kappa_ {2} (A)}, Q T Q = I + E MGS 其 中 ∥ E MGS ∥ 2 = 1 − c 1 ( m , n ) ε u κ 2 ( A ) c 1 ( m , n ) ε u κ 2 ( A ) , 其中 c 1 ( m , n ) c_{1}(m,n) c 1 ( m , n ) 是与 m , n m,n m , n 相关的常数
而通过Householder变换计算的矩阵 Q Q Q 满足
Q T Q = I + E H 其 中 ∥ E H ∥ 2 ≈ ε u . Q ^ {\mathsf {T}} Q = I + E _ {H} \quad \text {其 中} \quad \| E _ {H} \| _ {2} \approx \varepsilon_ {u}. Q T Q = I + E H 其 中 ∥ E H ∥ 2 ≈ ε u . 因此, 如果正交性至关重要, 则当 A A A 的列向量接近线性相关时, 建议使用Householder变换.
另外, 基于MGS的QR分解所计算得到的 Q Q Q (由于舍入误差的原因, Q Q Q 不一定是列正交的)和 R R R 满足[15,88]
∥ A − Q R ∥ ≈ ∥ A ∥ 2 ε u , ( ∥ A − Q R ∥ ≤ c 2 ( m , n ) ∥ A ∥ 2 ε u ) \| A - Q R \| \approx \| A \| _ {2} \varepsilon_ {u}, \quad (\| A - Q R \| \leq c _ {2} (m, n) \| A \| _ {2} \varepsilon_ {u}) ∥ A − QR ∥ ≈ ∥ A ∥ 2 ε u , ( ∥ A − QR ∥ ≤ c 2 ( m , n ) ∥ A ∥ 2 ε u ) 而且存在单位列正交矩阵 Q ~ \tilde{Q} Q ~ 使得 [57]
∥ A − Q ~ R ∥ ≈ ∥ A ∥ 2 ε u . \left\| A - \tilde {Q} R \right\| \approx \left\| A \right\| _ {2} \varepsilon_ {u}. A − Q ~ R ≈ ∥ A ∥ 2 ε u . 例3.3 编写程序, 分别用GS, MGS和Householder变换计算 n n n 阶Hilbert矩阵 H H H 的QR分解,并比较三种算法的稳定性,即观察 ∥ Q ~ R ~ − H ∥ 2 \| \tilde{Q}\tilde{R} - H\|_2 ∥ Q ~ R ~ − H ∥ 2 和 ∥ Q ~ T Q ~ − I ∥ 2 \|\tilde{Q}^{\mathsf{T}}\tilde{Q} - I\|_2 ∥ Q ~ T Q ~ − I ∥ 2 的值,其中 Q ~ \tilde{Q} Q ~ 和 R ~ \tilde{R} R ~ 是计算出来的QR分解矩阵因子. 试验结果如下. (QR_3methods.m)
也可以通过重正交来提升MGS的稳定性,即进行两次MGS.
例3.4 编写程序, 分别用 GS, MGS, 两次 MGS 和 Householder 变换计算 QR 分解. 下面是针对 256 的随机矩阵, 在不同条件数下各种方法的稳定性, 试验结果如下, 其中 MGS(double) 是指两次 MGS. (QR_3methods_MGS2.m, QR_3methods_256_64.m)