def mgs(A):
  """MGS computes QR factors"""
  from pylab import shape, zeros, eye, norm, dot
  import sys, numpy

  twoeps = 2.0 * numpy.finfo(numpy.double).eps
  (m, n) = shape(A)
  R = zeros((n,n))
  scal = abs(A).max()
  if scal == 0:
     Q = eye(m,n)
     return (Q,R)
  Q = A.copy()
  for i in range(n):
     r = norm(Q[:,i],2)
     R[i,i] = r
     if abs(r)/scal < twoeps:
        sys.exit('nearly zero col')
     w = Q[:,i] / r
     Q[:,i] = w
     for j in range(i+1,n):
        r = dot(w,Q[:,j])
        R[i,j] = r
        Q[:,j] = Q[:,j] - r * w
  return (Q,R)
