Note: scipy.linalg
, not numpy.linalg
!
import numpy as np
import scipy.linalg as la
import matplotlib.pyplot as pt
n = 100
A0 = np.random.randn(n, n)
U0, sigma0, VT0 = la.svd(A0)
print(la.norm((U0*sigma0).dot(VT0) - A0))
sigma = np.exp(-np.arange(n))
A = (U0 * sigma).dot(VT0)
Compute the QR factorization with pivoting=True
.
Q, R, perm = la.qr(A, pivoting=True)
First of all, check that we've obtained a valid factorization
la.norm(A[:, perm] - Q.dot(R), 2)
la.norm(Q.dot(Q.T) - np.eye(n))
Next, examine $R$:
pt.imshow(np.log10(1e-15+np.abs(R)))
pt.colorbar()
Specifically, recall that the diagonal of $R$ in QR contains column norms:
pt.semilogy(np.abs(np.diag(R)))
scipy
's transform, diagonal entries of $R$ are guaranteed non-increasing.