QR分解是把一个矩阵拆成正交矩阵和上三角矩阵的积,即
A
=
Q
R
A=QR
A=QR
Gram-Schmidt的方法是寻找投影然后单位化
Gram-Schmidt是先定方向
d
i
d_i
di再单位化得到
q
i
q_i
qi
第一个方向选A的第一个列向量就可以
第二方向把A的第二个列向量减去它在
q
1
q_1
q1方向上的分量就可以得到和
q
1
q_1
q1垂直的方向,后面的同理
方向 | 单位化 |
---|---|
d 1 = a 1 d_1=a1 d1=a1 | q 1 = d 1 ∣ ∣ d 1 ∣ ∣ q_1=\frac{d_1}{||d_1||} q1=∣∣d1∣∣d1 |
d 2 = a 2 − ( a 2 T q 1 ) q 1 d_2=a_2-(a_2^Tq_1)q_1 d2=a2−(a2Tq1)q1 | q 2 = d 2 ∣ ∣ d 2 ∣ ∣ q_2=\frac{d_2}{||d_2||} q2=∣∣d2∣∣d2 |
d 3 = a 3 − ( a 3 T q 1 ) q 1 − ( a 3 T q 2 ) q 2 d_3=a_3-(a_3^Tq_1)q_1-(a_3^Tq_2)q_2 d3=a3−(a3Tq1)q1−(a3Tq2)q2 | q 3 = d 3 ∣ ∣ d 3 ∣ ∣ q_3=\frac{d_3}{||d_3||} q3=∣∣d3∣∣d3 |
… | … |
通过这样转化得到的正交基对于A有特殊的意义,因为 a 1 a_1 a1只需要第一个基向量线性组合就可以得出, a 2 a_2 a2只需要前两个基向量组合.所以最后整体A矩阵在基向量上的系数矩阵就是一个上三角矩阵
这样就可以得到 A = Q R A=QR A=QR
需要注意的是如果有一个列向量完全等于一个前面的正交基或者是非常接近,会导致在减去那个方向分量时把整个向量都减掉,最后得到一个零向量或者是在数值上逼近零的向量,这会导致后面单位化出现除零的bug