QR和RQ分解
记 A A A为方阵, P , Q P, Q P,Q分别为正交单位阵和上三角阵,则形如 A = Q R A=QR A=QR的分解为QR分解;形如 A = R Q A=RQ A=RQ的分解为RQ分解。
在scipy.linalg
中,为二者提供了相同的参数,除了待分解矩阵a
之外,还有下列参数
-
overwrite_a
默认为False
,为True
时,将在矩阵分解时覆盖a
的值 -
lwork
工作数组的尺寸 -
mode
默认'full'
,用于调整返回值,可选4个参数-
'full'
:返回 Q Q Q和 R R R -
'r'
:返回 R R R -
'economic'
:返回 Q Q Q和 R R R,但是合并在一起 -
'raw'
:返回 Q Q Q和 T A U TAU TAU矩阵
-
-
pivoting
默认False
,当为True
时,计算 A P = Q R AP=QR AP=QR,但要求选择合适的 P P P,从而让 R R R的对角线非递增 -
check_finite
默认为True
,表示检查是否有限
import numpy as np
import scipy.linalg as sl
A = np.random.rand(3,3)
q1,r1 = sl.qr(A)
r2,qr = sl.rq(A)
结果得到 q 1 q_1 q1和 q 2 q_2 q2分别为,可见二者并不相等。
q 1 = [ − 0.659450021160935 0.749759308692653 0.0546502389707366 − 0.180811070132312 − 0.0876283110599659 − 0.979606367893955 − 0.729680085043063 − 0.65588280822834 0.193351274529173 ] q 2 = [ 0.377636504144627 − 0.925556186272606 0.0271370003857254 − 0.0674267508884556 0.00174208653633345 0.99772270616596 − 0.923495697879558 − 0.378606274627098 − 0.0617493709355736 ] q_1 = \left[\begin{matrix}-0.659450021160935 & 0.749759308692653 & 0.0546502389707366\\-0.180811070132312 & -0.0876283110599659 & -0.979606367893955\\-0.729680085043063 & -0.65588280822834 & 0.193351274529173\end{matrix}\right]\\ q_2=\left[\begin{matrix}0.377636504144627 & -0.925556186272606 & 0.0271370003857254\\-0.0674267508884556 & 0.00174208653633345 & 0.99772270616596\\-0.923495697879558 & -0.378606274627098 & -0.0617493709355736\end{matrix}\right] q1= −0.659450021160935−0.180811070132312−0.7296800850430630.749759308692653−0.0876283110599659−0.655882808228340.0546502389707366−0.9796063678939550.193351274529173 q2= 0.377636504144627−0.0674267508884556−0.923495697879558−0.9255561862726060.00174208653633345−0.3786062746270980.02713700038572540.99772270616596−0.0617493709355736
但是 q 1 r 1 q_1r_1 q1r1的确是等于 r 2 q 2 r_2q_2 r2q2的。
>>> q1@r1
array([[0.81677429, 0.63368526, 0.84867074],
[0.22394697, 0.10848293, 0.58357567],
[0.90375906, 0.37051483, 0.06042968]])
>>> q2@r2
array([[-0.09631134, -0.22572231, -0.15900946],
[ 0.01719633, -0.05246553, -0.90632485],
[ 0.23552571, -0.94691613, 1.13446376]])
>>> r2@q2
array([[0.81677429, 0.63368526, 0.84867074],
[0.22394697, 0.10848293, 0.58357567],
[0.90375906, 0.37051483, 0.06042968]])
其他函数
除了qr
和rq
这两个函数外,scipy.linalg
还提供了其他与qr
分解相关的函数。
qr_multiply(a,c)
,在对
A
A
A进行
Q
R
QR
QR分解之后,返回
C
Q
CQ
CQ,其参数中,overwrite_a, overwrite_c, privoting
与qr
函数中的作用相同,或可类比。此外,还有其他两个参数
-
mode
可选left
或right
,分别表示返回 Q C QC QC或 C Q CQ CQ -
conjugate
为True
时,返回Q
的复共轭
qr_update(Q, R, u, v)
,若
A
=
Q
R
A=QR
A=QR是QR分解,则返回
A
+
u
v
T
A+uv^T
A+uvT的QR分解。此函数也支持overwrite_qruv, check_finite
参数。
qr_delete(Q,R,k,p)
和qr_insert(Q,R,u,k)
分别用于矩阵的删减和增添,对于
A
=
Q
R
A=QR
A=QR而言,前者从第
k
k
k行/列删掉
p
p
p行/列;后者在第
k
k
k行/列插入
U
U
U。
这两个函数均支持check_finite
,覆写开关分别是overwrite_qr
和overwrite_qru
,通过which
来调整插入/删除的是行还是列,即which='row'
时,针对行操作,为'cols'
时,针对列操作。