3.3_QR分解

3.3 QR分解

QR分解是将一个矩阵分解一个正交矩阵(酉矩阵)和一个三角矩阵的乘积. QR分解被广泛应用于线性最小二乘问题的求解和矩阵特征值的计算.

3.3.1 QR分解的存在性与唯一性

定理3.9 (QR分解) [73] 设 ACm×nA \in \mathbb{C}^{m \times n} ( mnm \geq n ), 则存在一个单位列正交矩阵 QCm×nQ \in \mathbb{C}^{m \times n} (即 QQ=In×nQ^{*}Q = I_{n \times n} ) 和一个上三角矩阵 RCn×nR \in \mathbb{C}^{n \times n} , 使得

A=QR.(3.8)A = Q R. \tag {3.8}

AA 列满秩, 则存在一个具有正对角线元素的上三角矩阵 RR 使得 (3.8) 成立, 且此时 QR 分解唯一, 即 QQRR 都唯一.

证明. 设 A=[a1,a2,,an]Cm×nA = [a_{1}, a_{2}, \ldots, a_{n}] \in \mathbb{C}^{m \times n} . 若 AA 列满秩, 即 rank(A)=n\operatorname{rank}(A) = n . 则 QR 分解 (3.8) 就是对 AA 的列向量组进行 Gram-Schmidt 正交化过程的矩阵描述 (见算法 3.3).

算法3.3.Gram-Schmidt正交化过程

1: r11=a12r_{11} = \left\| a_1\right\| _2
2: q1=a1/r11q_{1} = a_{1} / r_{11}
3: for j=2j = 2 to nn do
4: qj=ajq_{j} = a_{j}
5: for i=1i = 1 to j1j - 1 do
6: rij=(aj,qi)%r_{ij} = (a_j, q_i) \quad \% 计算内积, 用于正交化
7: qj=qjrijqiq_{j} = q_{j} - r_{ij}q_{i}
8: end for
9: rjj=qj2r_{jj} = \| q_j\| _2
10: qj=qj/rjjq_{j} = q_{j} / r_{jj}
11: end for

由算法3.3可知

a1=r11q1,aj=r1jq1+r2jq2++rjjqj=[q1,q2,,qj][r1jr2jrjj],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.

Q=[q1,q2,,qn]Q = [q_{1}, q_{2}, \ldots, q_{n}] , R=[rij]n×nR = [r_{ij}]_{n \times n} , 其中

rij={qiaj,f o rij0,f o ri>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}

于是Gram-Schmidt正交化过程可表示为

[a1,a2,,an]=[q1,q2,,qn][r11r12r1nr22r2nrn1,nrnn],A=QR.[ 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.

如果 AA 不是列满秩, 我们可以通过下面的方式做类似的正交化过程:

  • 如果 a1=0a_1 = 0 , 则令 q1=0q_1 = 0 ; 否则令 q1=a1/a12q_1 = a_1 / \|a_1\|_2 ;

  • 对于 j=2,3,,nj = 2,3,\ldots ,n ,计算 q~j=aji=1j1(qiaj)qi\tilde{q}_j = a_j - \sum_{i = 1}^{j - 1}(q_i^* a_j)q_i 如果 q~j=0\tilde{q}_j = 0 ,则表明 aja_{j} 可以由 a1,a2,,aj1a_1,a_2,\dots ,a_{j - 1} 线性表出,令 qj=0.q_{j} = 0. 否则令 qj=q~j/q~j2q_{j} = \tilde{q}_{j} / \| \tilde{q}_{j}\|_{2}

于是我们有

A=QR,A = Q R,

其中 Q=[q1,q2,,qn]Q = [q_{1}, q_{2}, \ldots, q_{n}] 列正交 (但不是单位列正交), 其列向量要么是单位向量, 要么就是零向量. R=[rij]n×nR = [r_{ij}]_{n \times n} 的定义同 (3.9). 需要注意的是, 如果 QQ 的某一列 qk=0q_{k} = 0 , 那么 RR 中对应的第 kk 行就全部为 0.

rank(A)=l<n\operatorname{rank}(A) = l < n ,则 QQll 个非零列,设为 qi1,qi2,,qilq_{i_1}, q_{i_2}, \ldots, q_{i_l} . 它们形成 Cm\mathbb{C}^m 中的一个单位正交向量组,所以我们可以将其扩展成 Cm\mathbb{C}^m 中的一组标准正交基,即

qi1,qi2,,qil,q~1,,q~ml.q _ {i _ {1}}, q _ {i _ {2}}, \dots , q _ {i _ {l}}, \tilde {q} _ {1}, \dots , \tilde {q} _ {m - l}.

然后我们用 q~1\tilde{q}_1 替换 QQ 中的第一个零列, 用 q~2\tilde{q}_2 替换 QQ 中的第二个零列, 依此类推, 将 QQ 中的所有零列都替换掉. 将最后得到的矩阵记为 Q~\tilde{Q} , 则 Q~Cm×n\tilde{Q} \in \mathbb{C}^{m \times n} 单位列正交, 且

Q~R=QR.\tilde {Q} R = Q R.

这是由于 Q~\tilde{Q} 中的新添加的列向量正好与 RR 中的零行相对应. 所以我们有 QR 分解

A=Q~R.A = \tilde {Q} R.

下面证明满秩矩阵QR分解的存在唯一性

存在性: 由于 AA 列满秩, 由 Gram-Schmidt 正交化过程 (算法 3.3) 可知, 存在上三角矩阵 R=[rij]n×nR = [r_{ij}]_{n \times n} 满足 rjj>0r_{jj} > 0 , 使得 A=QRA = QR , 其中 QQ 单位列正交.

唯一性: 假设 AA 存在 QR 分解

A=Q1R1=Q2R2,A = Q _ {1} R _ {1} = Q _ {2} R _ {2},

其中 Q1,Q2Cm×nQ_{1}, Q_{2} \in \mathbb{C}^{m \times n} 单位列正交, R1,R2Cn×nR_{1}, R_{2} \in \mathbb{C}^{n \times n} 为具有正对角元素的上三角矩阵. 则有

Q1=Q2R2R11.(3.10)Q _ {1} = Q _ {2} R _ {2} R _ {1} ^ {- 1}. \tag {3.10}

于是

1=Q12=Q2R2R112=R2R112.1 = \| Q _ {1} \| _ {2} = \| Q _ {2} R _ {2} R _ {1} ^ {- 1} \| _ {2} = \| R _ {2} R _ {1} ^ {- 1} \| _ {2}.

R1,R2R_{1}, R_{2} 均为上三角矩阵, 所以 R2R11R_{2}R_{1}^{-1} 也是上三角矩阵, 且其对角线元素为 R2(i,i)/R1(i,i)R_{2}(i,i) / R_{1}(i,i) ,

i=1,2,,n.i = 1,2,\dots ,n. 因此

R2(i,i)R1(i,i)ρ(R2R11)R2R1121,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.

同理可证 R1(i,i)/R2(i,i)1.R_{1}(i,i) / R_{2}(i,i)\leq 1. 所以

R1(i,i)=R2(i,i),i=1,2,,n.R _ {1} (i, i) = R _ {2} (i, i), \quad i = 1, 2, \dots , n.

Q1F2=tr(Q1Q1)=n,\| Q_1\| _F^2 = \mathrm{tr}(Q_1^* Q_1) = n, 所以由(3.10)可知

R2R11F2=Q2R2R11F2=Q1F2=n.\| R _ {2} R _ {1} ^ {- 1} \| _ {F} ^ {2} = \| Q _ {2} R _ {2} R _ {1} ^ {- 1} \| _ {F} ^ {2} = \| Q _ {1} \| _ {F} ^ {2} = n.

由于 R2R11R_{2}R_{1}^{-1} 的对角线元素都是1,所以 R2R11R_{2}R_{1}^{-1} 只能是单位矩阵,即 R2=R1R_{2} = R_{1} 因此 Q2=AR21=Q_{2} = AR_{2}^{-1} = AR11=Q1AR_1^{-1} = Q_1 ,即 AA 的QR分解是唯一的. □

A 有时也将 QR 分解定义为: 存在酉矩阵 QCm×mQ \in \mathbb{C}^{m \times m} 使得

A=QR,A = Q R,

其中 R=[R110]Cm×nR = \left[ \begin{array}{c} R_{11} \\ 0 \end{array} \right] \in \mathbb{C}^{m \times n} 是上三角矩阵.

如果 AA 是实矩阵, 则上面证明中的运算都可以在实数下进行, 因此 QQRR 都可以是实矩阵.
如果 AA 是非奇异的方阵, 则 QR 分解也可以用来求解线性方程组 Ax=bAx = b .

Gram-Schmidt正交化与正交投影

Gram-Schmidt 正交化过程的第 jj 步:

q~j=ajr1jq1r2jq2rj1,jqj1\tilde {q} _ {j} = a _ {j} - r _ {1 j} q _ {1} - r _ {2 j} q _ {2} - \dots - r _ {j - 1, j} q _ {j - 1}

可以看作是 aja_{j} 减去其在 span{q1,q2,,qj1}\operatorname{span}\{q_1, q_2, \ldots, q_{j-1}\} 内的正交投影. 事实上, rijqir_{ij}q_i 就是 aja_{j}qiq_i 方向的正交投影, 即

Pspan{qi}aj=(qiqi)aj=(qiaj)qi=rijqi.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}.

下面给出QR分解的具体实现方法,分别基于MGS正交化过程, Householder变换和Givens变换.

3.3.2 基于MGS的QR分解

在证明QR分解的存在性时,我们利用了Gram-Schmidt正交化过程.但由于数值稳定性方面的原因,在实际计算中,我们一般不采用Gram-Schmidt正交化过程,取而代之的是修正的Gram-Schmidt正交化过程(modified Gram-Schmidt process,MGS),即对正交化过程做如下修改:

  • Gram-Schmidt 正交化过程的第 jj 步:

(1) 计算 rij=(aj,qi)r_{ij} = (a_j, q_i) , i=1,2,,j1i = 1, 2, \ldots, j - 1 ;
(2) 计算 q~j=ajr1jq1r2jq2rj1,jqj1;\tilde{q}_j = a_j - r_{1j}q_1 - r_{2j}q_2 - \dots -r_{j - 1,j}q_{j - 1};
(3) 计算 rjj=q~jr_{jj} = \|\tilde{q}_j\| , qj=q~j/rjjq_j = \tilde{q}_j / r_{jj} ;

  • MGS 正交化过程的第 jj 步:

(1) 令 q~j=aj\tilde{q}_j = a_j
(2) 计算 rij=(q~j,qi)r_{ij} = (\tilde{q}_j, q_i) , q~j=q~jrijqi\tilde{q}_j = \tilde{q}_j - r_{ij}q_i , i=1,2,,j1i = 1, 2, \ldots, j-1 ;
(3) 计算 rjj=q~jr_{jj} = \|\tilde{q}_j\| , qj=q~j/rjjq_j = \tilde{q}_j / r_{jj} ;

可以证明, 数学上这两个算法完全等价, 即 rijr_{ij}qjq_j 都一样. 但在数值上, Gram-Schmidt 正交化过程是不稳定的, 而 MGS 是向后稳定的 [98].

算法3.4.基于MGS的QR分解

%\% Given ACm×nA \in \mathbb{C}^{m \times n} , compute Q=[q1,,qn]Rm×nQ = [q_1, \ldots, q_n] \in \mathbb{R}^{m \times n} and RRn×nR \in \mathbb{R}^{n \times n} such that A=QRA = QR

1: Set R=[rij]=0n×nR = [r_{ij}] = 0_{n \times n} (the n×nn \times n zero matrix)
2: if a1=0a_1 = 0 then
3: q1=0q_{1} = 0
4: else
5: r11=a12,q1=a1/a12r_{11} = \| a_1\| _2, \quad q_1 = a_1 / \| a_1\| _2
6: end if
7: for j=2j = 2 to nn do
8: qj=ajq_{j} = a_{j}
9: for i=1i = 1 to j1j - 1 do %\% MGS, 注意与 GS 的区别
10: rij=(qj,qi),qj=qjrijqir_{ij} = (q_j,q_i),\quad q_j = q_j - r_{ij}q_i
11: end for
12: if qj0q_{j}\neq 0 then
13: rjj=qj2,qj=qj/rjjr_{jj} = \| q_j\| _2, \quad q_j = q_j / r_{jj}
14: end if
15: end for

A 本算法的运算量大约为 2mn22mn^{2}
算法中 RR 是一列一列计算的, 因此也称为按列MGS (column-oriented MGS). 按列MGS不适合列主元, 因此, 如果需要计算列主元QR时需采用按行MGS (row-oriented MGS), 可参见相关资料.
由MGS得到的QR分解中, QRm×n,RRn×nQ\in \mathbb{R}^{m\times n},R\in \mathbb{R}^{n\times n}

3.3.3 基于Householder变换的QR分解

由定理3.5可知, 通过Householder变换, 我们可以将任何一个非零变量 xRnx \in \mathbb{R}^n 转化成 x2e1\| x\|_2e_1 , 即除第一个元素外, 其它都为零. 下面我们就考虑通过Householder变换来实现矩阵的QR分解.

ARm×nA \in \mathbb{R}^{m \times n} ( mnm \geq n ), 构造 Householder 变换 H1Rm×mH_1 \in \mathbb{R}^{m \times m} , 使得

H1[a11a21am1]=[r100].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].

于是

H1A=[r1a~12a~1n0A~20],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],

其中 A~2R(m1)×(n1)\tilde{A}_2\in \mathbb{R}^{(m - 1)\times (n - 1)} .同样地,我们可以构造一个Householder变换 H~2R(m1)×(m1)\tilde{H}_2\in \mathbb{R}^{(m - 1)\times (m - 1)} ,将 A~2\tilde{A}_2 的第一列中除第一个元素外的所有元素都化为0,即

H~2A~2=[r2a~23a~2n0A~30].\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].

H2=[100H~2]H_{2} = \left[ \begin{array}{cc}1 & 0\\ 0 & \tilde{H}_{2} \end{array} \right]H2Rm×mH_{2}\in \mathbb{R}^{m\times m} 也是Householder变换(见习题3.8),且

H2H1A=[r1a~12a~13a~1n0r2a~23a~2n00A~300].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].

不断重复上述过程, 我们就可以得到一系列的 Householder 变换

Hk=[Ik100H~k],H~kR(n+1k)×(n+1k),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,

使得

HnH2H1A=[r1a~12a~1n0r2a~2n00rn000000]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.

由于Householder变换都是正交矩阵,令

Q(HnH2H1)1=H11H21Hn1=H1H2Hn,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},

QQ 也是正交矩阵,且

A=(Hn1H2H1)1R=QR.A = (H _ {n - 1} \cdot \cdot \cdot H _ {2} H _ {1}) ^ {- 1} R = Q R.

以上就是基于Householder变换的QR分解的具体实现过程.最后所得到的上三角矩阵 RR 就存放在 AA 的上三角部分.

如果不需要生成 QQ , 则基于 Householder 变换的 QR 分解的运算量大约为 2mn22n3/32mn^{2} - 2n^{3}/3 .

矩阵 QQ 可通过下面的累积方法来计算:

{Q=Im,Q=QHk,k=1,2,,n.\left\{ \begin{array}{l} Q = I _ {m}, \\ Q = Q H _ {k}, \quad k = 1, 2, \ldots , n. \end{array} \right.

如果保留了每一步的Householder向量, 则 QQ 也可以通过下面的向后累积方法来计算:

Q=Im,Q = I _ {m},
Q=HkQ,k=n,n1,,1.Q = H _ {k} Q, \quad k = n, n - 1, \dots , 1.

这样做的好处是一开始 QQ 会非常稀疏 (左上角为单位矩阵), 随着迭代的进行, QQ 才会慢慢变满. 而前面的计算方法, 第一步就将 QQ 变成了一个满矩阵.

采用向后累积方法计算 QQ 的运算量大约为 4m2n4mn2+4n3/34m^{2}n - 4mn^{2} + 4n^{3} / 3 . 如果只需要计算 QQ 的前 nn 列, 则运算量大约为 2mn22n3/32mn^{2} - 2n^{3} / 3 , 此时 QR 分解的总运算量为 4mn24n3/34mn^{2} - 4n^{3} / 3 . 若 m=nm = n , 则为 8n3/38n^{3} / 3 .

算法3.5.基于Householder变换的QR分解

%\% Given ARm×nA \in \mathbb{R}^{m \times n} , compute QQ and RR such that A=QRA = QR where QRm×mQ \in \mathbb{R}^{m \times m} and RRm×nR \in \mathbb{R}^{m \times n} .
%\% The upper triangular part of RR is stored in the upper triangular part of AA

1: Set Q=Im×mQ = I_{m \times m}
2: for k=1k = 1 to nn do
3: x=A(k:m,k)x = A(k:m,k)
4: [βk,vk]=House(x)[\beta_k, v_k] = \mathbf{House}(x)
5: A(k:m,k:n)=(Imk+1βkvkvk)A(k:m,k:n)A(k:m,k:n) = (I_{m - k + 1} - \beta_kv_kv_k^\top)A(k:m,k:n)
6: =A(k:m,k:n)βkvk(vkTA(k:m,k:n))= A(k:m,k:n) - \beta_{k}v_{k}\big(v_{k}^{\mathsf{T}}A(k:m,k:n)\big)
7: Q(:,k:m)=Q(:,k:m)(Imk+1βkvkvk)Q(:, k : m) = Q(:, k : m)(I_{m-k+1} - \beta_k v_k v_k^\top)
8: =Q(:,k:m)βk(Q(:,k:m)vk)vkT= Q(:,k:m) - \beta_{k}\big(Q(:,k:m)v_{k}\big)v_{k}^{\mathsf{T}}
9: end for

上面的算法只是关于Householder QR分解的一个简单描述,并没有考虑运算量问题.在实际计算时,我们通常会保留所有的Householder向量(用于向后累积法计算 QQ ).由于第 kk 步中 H~k\tilde{H}_k 所对应的Householder向量 vkv_{k} 的长度为 mk+1m - k + 1 ,因此我们先把 vkv_{k} 单位化,使得 vkv_{k} 的第一元素为1,这样就只要存储 vk(2:end)v_{k}(2:end) ,共 mkm - k 个元素.于是我们就可以把所有的

Householder 向量存放在 AA 的严格下三角部分. 而 AA 的上三角部分仍然存放 RR .

事实上, 如果没有明确要求生成 QQ , 通常只需存储 vkv_{k}βk\beta_{k} , 即以因式分解 (Factored-Form) 形式存储 QQ [57].

我们也可以考虑块Householder QR分解,以便充分利用3级BLAS运算,提高计算效率.
算法3.5针对的是实矩阵,如果是复矩阵则要适当做些修改

3.3.4 列主元QR分解

如果 AA 不是满秩, 记 lrank(A)<nl \triangleq \operatorname{rank}(A) < n , 则存在一个置换矩阵 PP , 使得 APAP 的前 ll 列是线性无关的. 因此我们可以对 APAP 进行 QR 分解, 于是我们可以得到下面的结论.

定理3.10 (列主元QR分解) 设 ACm×nA \in \mathbb{C}^{m \times n} ( mnm \geq n ), 且 rank(A)=l<n\operatorname{rank}(A) = l < n . 则存在置换矩阵 PP 和正交矩阵 QCm×mQ \in \mathbb{C}^{m \times m} , 使得

AP=Q[R11R1200]m×n,A P = Q \left[ \begin{array}{c c} R _ {1 1} & R _ {1 2} \\ 0 & 0 \end{array} \right] _ {m \times n},

其中 R11Cl×lR_{11}\in \mathbb{C}^{l\times l} 是非奇异上三角矩阵,且对角线元素满足 r11r22rll>0r_{11}\geq r_{22}\geq \dots \geq r_{ll} > 0

A 上述结论也可简化为

AP=Q1[R11R12],A P = Q _ {1} \left[ \begin{array}{c c} R _ {1 1} & R _ {1 2} \end{array} \right],

其中 Q1Cm×lQ_{1}\in \mathbb{C}^{m\times l} 单位列正交(上述结论中 QQ 的前 ll 列).

列主元QR分解的实现过程与QR分解基本类似,只是在第 kk 步时,需要选列主元,同时可能需要做一个列交换.

假设经过 k1k - 1 步后,我们得到下面的分解

AP(k1)=Q(k1)[R11(k1)R12(k1)0R22(k1)]Q(k1)R(k1),(Q(k1))TAP(k1)=R(k1),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)},

其中 P(k1)P^{(k - 1)} 是置换矩阵, Q(k1)Q^{(k - 1)} 是正交矩阵, R11(k1)R(k1)×(k1)R_{11}^{(k - 1)}\in \mathbb{R}^{(k - 1)\times (k - 1)} 是非奇异上三角矩阵

下面考虑第 kk 步:

(1) 首先计算 R22(k1)R_{22}^{(k - 1)} 的所有列的范数, 如果范数都为0, 则 R22(k1)=0R_{22}^{(k - 1)} = 0 , 此时必有 k1=lk - 1 = l , 算法结束.
(2) 当 klk \leq l 时, R22(k1)0R_{22}^{(k-1)} \neq 0 , 记其范数最大的列为第 iki_k 列 (如果有相等的, 取其中一个即可). 若 ik1i_k \neq 1 , 则交换 R(k1)R^{(k-1)} 的第 kk 列与第 ik+k1i_k + k - 1 列, 并记相应的置换矩阵为 PkP_k .
(3) 由于列交换不会影响到 R(k1)R^{(k - 1)} 的前 k1k - 1 列, 因此列交换后的矩阵可记为

R(k1)Pk[R11(k1)R~12(k1)0R~22(k1)].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~22(k1)\tilde{R}_{22}^{(k - 1)} 的第1列所对应的Householder变换 H~k\tilde{H}_k ,并令 Hk=[Ik100H~k],P(k)=P(k1)Pk,H_{k} = \left[ \begin{array}{cc}I_{k - 1} & 0\\ 0 & \tilde{H}_{k} \end{array} \right],P^{(k)} = P^{(k - 1)}P_k, 于是

Hk(Q(k1))TAP(k)=HkR(k1)Pk=[R11(k1)R~12(k1)0H~kR~22(k1)]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~kR~22(k1)\tilde{H}_k\tilde{R}_{22}^{(k - 1)} 的第一列除第一个元素外, 其余都是零, 且该元素的值等于 R~22(k1)\tilde{R}_{22}^{(k - 1)} 的第1列的范数. 记 Q(k)Q(k1)HkTQ^{(k)}\triangleq Q^{(k - 1)}H_k^{\mathsf{T}} , 则

AP(k)=Q(k)R(k)=[R11(k)R12(k)0R22(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],

其中 R11(k)Rk×kR_{11}^{(k)}\in \mathbb{R}^{k\times k} 为非奇异上三角矩阵

依此类推, 直到第 ll 步, 我们就可以得到 AA 的列主元 QR 分解, 其中 R11R_{11} 的对角线元素非负且按降序排列是由列主元的选取方法和 Householder 变换的性质得到的.

下面是列主元 QR 分解的一个应用.

推论3.11 (满秩分解) 设 ACm×nA \in \mathbb{C}^{m \times n}rank(A)=rmin{m,n}\operatorname{rank}(A) = r \leq \min\{m, n\} , 则存在满秩矩阵 FCm×rF \in \mathbb{C}^{m \times r}GCr×nG \in \mathbb{C}^{r \times n} , 使得

A=FG.A = F G.

3.3.5 基于Givens变换的QR分解

我们同样可以利用Givens变换来做QR分解

ARn×nA \in \mathbb{R}^{n \times n} , 首先构造一个Givens变换 G21G_{21} , 作用在 AA 的最前面的两行上, 使得

G21[a11a21a31an1]=[a~110a31an1].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].

由于 G21G_{21} 只改变矩阵的第1行和第2行的值, 所以其它行保存不变. 然后再构造一个Givens变换 G31G_{31} , 作用在 G21AG_{21}A 的第1行和第3行, 将其第一列的第三个元素化为零. 由于 G31G_{31} 只改变矩阵的第1行和第3行的值, 所以第二行的零元素维持不变. 以此类推, 我们可以构造一系列的Givens变换 G41,G51,,Gn1G_{41}, G_{51}, \ldots, G_{n1} , 使得 Gn1G21AG_{n1} \cdots G_{21}A 的第一列中除第一个元素外, 其它元素都化为零, 即

Gn1G21A=[00].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].

下面我们可以对第二列进行类似的处理.构造Givens变换 G32,G42,,Gn2G_{32},G_{42},\ldots ,G_{n2} ,将第二列的第3至第 n_n 个元素全化为零,同时保持第一列不变

以此类推, 我们对其他列也做类似的处理. 最后, 通过构造 12n(n1)\frac{1}{2} n(n - 1) 个Givens变换, 将 AA

化成一个上三角矩阵 RR ,即

R=Gn,n1G21A.R = G _ {n, n - 1} \dots G _ {2 1} A.

Q=(Gn,n1G21)TQ = (G_{n,n - 1}\dots G_{21})^{\mathsf{T}} .由于Givens变换是正交矩阵,所以 QQ 也是正交矩阵.于是,我们就得到矩阵 AA 的QR分解

A=QR.A = Q R.

与Householder变换一样,在进行Givens变换时,我们不需要显式地写出Givens矩阵.

对于稠密矩阵而言, 基于Givens变换的QR分解的运算量比Householder变换要多很多.
当需要连续应用一系列Givens变换时,我们可以使用快速Givens变换(见[16]).但即便如此,其速度仍然要慢于Householder变换.因此基于Givens变换的QR分解主要用于当矩阵的非零下三角元素相对较少时的情形(比如对上Hessenberg矩阵进行QR分解),或者稀疏矩阵(可以尽可能地保留矩阵的稀疏性).
A 另外, 由于每次 Givens 变换只影响矩阵的两行或者两列, 因此非常适合并行计算.
如果 ARm×nA \in \mathbb{R}^{m \times n} , 其中 m>nm > n , 我们仍然可以通过Givens变换进行QR分解.

下面是基于Givens变换的QR分解的算法描述

算法3.6.基于Givens变换的QR分解

%\% Given ARm×nA \in \mathbb{R}^{m \times n} , compute QQ and RR such that A=QRA = QR where QRm×mQ \in \mathbb{R}^{m \times m} and RRm×nR \in \mathbb{R}^{m \times n} .

%\% The upper triangular part of RR is stored in the upper triangular part of AA

1: Set Q=Im×mQ = I_{m \times m}
2: for k=1k = 1 to nn do
3: for i=k+1i = k + 1 to mm do
4: [c,s]=givens(akk,aik)[c, s] = \text{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} where G=[cssc]G = \begin{bmatrix} c & s\\ -s & c \end{bmatrix}
6: [Q(1:m,k),Q(1:m,i)]=[Q(1:m,k),Q(1:m,i)]GT[Q(1:m,k),Q(1:m,i)] = [Q(1:m,k),Q(1:m,i)]G^{\mathsf{T}}
7: end for
8: end for

3.3.6 QR分解的稳定性

基于Householder变换和Givens变换的QR分解都具有很好的数值稳定性.详细分析可以参考[135]和[70].基于MGS的QR分解也是向后稳定的,参见[98].

当需要计算矩阵 QQ 时, 基于MGS的QR分解的运算量相对较少. 因此当 AA 的列向量具有很好的线性无关性时, 我们可以使用MGS来计算QR分解. 但需要注意的是, MGS得到的 QQ 不是方阵, 除非 AA 是方阵.

但是, 由于舍入误差的原因, 最后得到的矩阵 QQ 会带有一定的误差, 可能会导致 QQ 失去正交性. Björck [15, 88] 证明了, 通过 MGS 计算的矩阵 QQ 满足

QTQ=I+EMGS其 中EMGS2=c1(m,n)εuκ2(A)1c1(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)},

其中 c1(m,n)c_{1}(m,n) 是与 m,nm,n 相关的常数

而通过Householder变换计算的矩阵 QQ 满足

QTQ=I+EH其 中EH2εu.Q ^ {\mathsf {T}} Q = I + E _ {H} \quad \text {其 中} \quad \| E _ {H} \| _ {2} \approx \varepsilon_ {u}.

因此, 如果正交性至关重要, 则当 AA 的列向量接近线性相关时, 建议使用Householder变换.

另外, 基于MGS的QR分解所计算得到的 QQ (由于舍入误差的原因, QQ 不一定是列正交的)和 RR 满足[15,88]

AQRA2εu,(AQRc2(m,n)A2εu)\| A - Q R \| \approx \| A \| _ {2} \varepsilon_ {u}, \quad (\| A - Q R \| \leq c _ {2} (m, n) \| A \| _ {2} \varepsilon_ {u})

而且存在单位列正交矩阵 Q~\tilde{Q} 使得 [57]

AQ~RA2εu.\left\| A - \tilde {Q} R \right\| \approx \left\| A \right\| _ {2} \varepsilon_ {u}.

例3.3 编写程序, 分别用GS, MGS和Householder变换计算 nn 阶Hilbert矩阵 HH 的QR分解,并比较三种算法的稳定性,即观察 Q~R~H2\| \tilde{Q}\tilde{R} - H\|_2Q~TQ~I2\|\tilde{Q}^{\mathsf{T}}\tilde{Q} - I\|_2 的值,其中 Q~\tilde{Q}R~\tilde{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)