def pinv2(a, cond=None, rcond=None): """Compute the (Moore-Penrose) pseudo-inverse of a matrix. Calculate a generalized inverse of a matrix using its singular-value decomposition and including all 'large' singular values. Parameters ---------- a : array, shape (M, N) Matrix to be pseudo-inverted cond, rcond : float or None Cutoff for 'small' singular values. Singular values smaller than rcond*largest_singular_value are considered zero. If None or -1, suitable machine precision is used. Returns ------- B : array, shape (N, M) Raises LinAlgError if SVD computation does not converge Examples -------- >>> from numpy import * >>> a = random.randn(9, 6) >>> B = linalg.pinv2(a) >>> allclose(a, dot(a, dot(B, a))) True >>> allclose(B, dot(B, dot(a, B))) True """ a = asarray_chkfinite(a) u, s, vh = decomp_svd(a) t = u.dtype.char if rcond is not None: cond = rcond if cond in [None, -1]: cond = {0: feps*1e3, 1: eps*1e6}[_array_precision[t]] m, n = a.shape cutoff = cond*numpy.maximum.reduce(s) psigma = zeros((m, n), t) for i in range(len(s)): if s[i] > cutoff: psigma[i, i] = 1.0/conjugate(s[i]) # XXX: use lapack/blas routines for dot return transpose(conjugate(dot(dot(u, psigma), vh)))
def pinv2(a, cond=None, rcond=None): """Compute the (Moore-Penrose) pseudo-inverse of a matrix. Calculate a generalized inverse of a matrix using its singular-value decomposition and including all 'large' singular values. Parameters ---------- a : array, shape (M, N) Matrix to be pseudo-inverted cond, rcond : float or None Cutoff for 'small' singular values. Singular values smaller than rcond*largest_singular_value are considered zero. If None or -1, suitable machine precision is used. Returns ------- B : array, shape (N, M) Raises LinAlgError if SVD computation does not converge Examples -------- >>> from numpy import * >>> a = random.randn(9, 6) >>> B = linalg.pinv2(a) >>> allclose(a, dot(a, dot(B, a))) True >>> allclose(B, dot(B, dot(a, B))) True """ a = asarray_chkfinite(a) u, s, vh = decomp_svd(a) t = u.dtype.char if rcond is not None: cond = rcond if cond in [None, -1]: cond = {0: feps * 1e3, 1: eps * 1e6}[_array_precision[t]] m, n = a.shape cutoff = cond * numpy.maximum.reduce(s) psigma = zeros((m, n), t) for i in range(len(s)): if s[i] > cutoff: psigma[i, i] = 1.0 / conjugate(s[i]) # XXX: use lapack/blas routines for dot return transpose(conjugate(dot(dot(u, psigma), vh)))