原文:https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.qr.html
校对:(虚位以待)
numpy.linalg.
qr
(a, mode='reduced')[source]计算矩阵的qr因式分解。
将矩阵a定义为qr,其中q是正交的,r是上三角形。
参数: | a:array_like,shape(M,N)
mode:{'reduced','complete','r','raw','full','economic'
|
---|---|
返回: | q:float或complex的ndarray,可选
r:浮点数或复数的数组,可选
(h,tau):n.pdouble或np.cdouble的ndarrays,可选
|
上升: | LinAlgError
|
笔记
这是LAPACK例程dgeqrf,zgeqrf,dorgqr和zungqr的接口。
有关qr因式分解的更多信息,请参见例如:http://en.wikipedia.org/wiki/QR_factorization
ndarray的子类保留,除了“raw”模式。因此,如果a的类型为matrix,所有返回值都将是矩阵。
在Numpy 1.8中添加了用于模式的新'reduced','complete'和'raw'选项,旧选项'full'被作为'reduced'的别名。此外,期权“完全”和“经济”被废弃。因为“full”是以前的默认值,“reduced”是新的默认值,所以通过让mode默认值可以保持向后兼容性。添加了'raw'选项,以便可以使用可以使用Householder反射器将数组乘以q的LAPACK例程。请注意,在这种情况下,返回的数组类型为np.double或np.cdouble,h数组转置为FORTRAN兼容。没有使用'raw'返回的例程目前由numpy暴露,但是一些在lapack_lite中可用,只是等待必要的工作。
例子
>>> a = np.random.randn(9, 6)
>>> q, r = np.linalg.qr(a)
>>> np.allclose(a, np.dot(q, r)) # a does equal qr
True
>>> r2 = np.linalg.qr(a, mode='r')
>>> r3 = np.linalg.qr(a, mode='economic')
>>> np.allclose(r, r2) # mode='r' returns the same r as mode='full'
True
>>> # But only triu parts are guaranteed equal when mode='economic'
>>> np.allclose(r, np.triu(r3[:6,:6], k=0))
True
示例说明qr
的常见用法:求解最小二乘问题
What are the least-squares-best m and y0 in y = y0 + mx
for the following data: {(0,1), (1,0), (1,2), (2,1)}. (图的点和你会看到它应该是y0 = 0,m = 1)通过求解过度确定的矩阵方程式提供答案:Ax = b
A = array([[0, 1], [1, 1], [1, 1], [2, 1]])
x = array([[y0], [m]])
b = array([[1], [0], [2], [1]])
如果A = qr,使得q是正交的(其总是可能通过Gram-Schmidt),则x = inv(r) t3 > * (qT) * b
。(但是,在numpy练习中,我们只需使用lstsq
。)
>>> A = np.array([[0, 1], [1, 1], [1, 1], [2, 1]])
>>> A
array([[0, 1],
[1, 1],
[1, 1],
[2, 1]])
>>> b = np.array([1, 0, 2, 1])
>>> q, r = LA.qr(A)
>>> p = np.dot(q.T, b)
>>> np.dot(LA.inv(r), p)
array([ 1.1e-16, 1.0e+00])