def _qr_factor_full(a, dtype=np.float):
    n, m = a.shape
    packed, pmut, rdiag, acnorm = \
        _manual_qr_factor_packed(a, dtype)
    r = np.zeros((n, m))
    for i in range(n):
        r[i,:i] = packed[i,:i]
        r[i,i] = rdiag[i]
    q = np.eye(m)
    v = np.empty(m)
    for i in range(n):
        v[:] = packed[i]
        v[:i] = 0
        hhm = np.eye(m) - 2 * np.outer(v, v) / np.dot(v, v)
        q = np.dot(hhm, q)
    return q, r, pmut