# numpy.linalg.qr¶

numpy.linalg.qr(a, mode='full')[source]

Compute the qr factorization of a matrix.

Factor the matrix a as qr, where q is orthonormal and r is upper-triangular.

Parameters : a : array_like Matrix to be factored, of shape (M, N). mode : {‘full’, ‘r’, ‘economic’}, optional Specifies the values to be returned. ‘full’ is the default. Economic mode is slightly faster then ‘r’ mode if only r is needed. q : ndarray of float or complex, optional The orthonormal matrix, of shape (M, K). Only returned if mode='full'. r : ndarray of float or complex, optional The upper-triangular matrix, of shape (K, N) with K = min(M, N). Only returned when mode='full' or mode='r'. a2 : ndarray of float or complex, optional Array of shape (M, N), only returned when mode='economic‘. The diagonal and the upper triangle of a2 contains r, while the rest of the matrix is undefined. LinAlgError : If factoring fails.

Notes

This is an interface to the LAPACK routines dgeqrf, zgeqrf, dorgqr, and zungqr.

Subclasses of ndarray are preserved, so if a is of type matrix, all the return values will be matrices too.

Examples

```>>> 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
```

Example illustrating a common use of qr: solving of least squares problems

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)}. (Graph the points and you’ll see that it should be y0 = 0, m = 1.) The answer is provided by solving the over-determined matrix equation Ax = b, where:

```A = array([[0, 1], [1, 1], [1, 1], [2, 1]])
x = array([[y0], [m]])
b = array([[1], [0], [2], [1]])
```

If A = qr such that q is orthonormal (which is always possible via Gram-Schmidt), then x = inv(r) * (q.T) * b. (In numpy practice, however, we simply use 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])
```

#### Previous topic

numpy.linalg.cholesky

numpy.linalg.svd