import numpy as np
import numpy.linalg as la
# http://fgiesen.wordpress.com/2013/06/02/modified-gram-schmidt-orthogonalization/
np.set_printoptions(precision=13)
if 0:
eps = 1e-8
A = np.array([
[1, 1, 1],
[eps,eps,0],
[eps,0, eps]
])
else:
A = np.random.randn(3, 3)
A
def test_orthogonality(orthogonal_vectors):
Q = np.array(orthogonal_vectors)
print "Q:"
print Q
print "Q^T Q:"
QtQ = np.dot(Q.T, Q)
QtQ[np.abs(QtQ) < 1e-15] = 0
print QtQ
orthogonal_vectors = []
for k in range(len(A.T)):
q0 = q = A[:, k]
for prev_q in orthogonal_vectors:
q = q - np.dot(prev_q, q0)*prev_q
q = q/la.norm(q)
orthogonal_vectors.append(q)
test_orthogonality(orthogonal_vectors)
(Edit this cell to see instructions.)
q0
?my_A = A.copy()
orthogonal_vectors = []
for k in range(len(A.T)):
q = my_A[:, k]
q = q/la.norm(q)
for j in range(k+1, len(A.T)):
...
orthogonal_vectors.append(q)
test_orthogonality(orthogonal_vectors)
(Edit this cell to see solution.)