numpy.linalg.qr¶
-
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'
如果K = min(M,N),那么
'reduced':返回具有维度(M,K),(K,N)(默认)的q,r' r返回h从'原始':返回h从'原始':返回h从'原始'返回h' ,已弃用。
选项“reduced”,“complete”和“raw”在numpy 1.8中是新增的,有关详细信息,请参见注释。默认值是'reduced',并且为了保持与numpy的早期版本的向后兼容性,它和旧的默认'full'可以省略。注意,以'原始'模式返回的数组h被转置以调用Fortran。“经济”模式已被弃用。模式“完全”和“经济”可以仅使用第一个字母向后兼容,但所有其他必须拼写出来。有关更多说明,请参阅注释。
返回: q:float或complex的ndarray,可选
具有正交列的矩阵。当mode ='complete'时,结果是一个正交/酉矩阵,取决于a是否是实数/复数。在这种情况下行列式可以是+/- 1。
r:浮点数或复数的数组,可选
上三角矩阵。
(h,tau):n.pdouble或np.cdouble的ndarrays,可选
数组h包含产生q和R的Householder反射器。 tau数组包含反射器的缩放因子。在已弃用的“经济”模式中,仅返回h。
上升: 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])