def pinv2(a, cond=None, rcond=None, return_rank=False, check_finite=True):
if check_finite:<EOL><INDENT>a = np.asarray_chkfinite(a)<EOL><DEDENT>else:<EOL><INDENT>a = np.asarray(a)<EOL><DEDENT>u, s, vh = decomp_svd.svd(a, full_matrices=False, check_finite=False)<EOL>if rcond is not None:<EOL><INDENT>cond = rcond<EOL><DEDENT>if cond in [None,-<NUM_LIT:1>]:<EOL><INDENT>t = u.dtype.char.lower()<EOL>factor = {'<STR_LIT:f>': <NUM_LIT>, '<STR_LIT:d>': <NUM_LIT>}<EOL>cond = factor[t] * np.finfo(t).eps<EOL><DEDENT>rank = np.sum(s > cond * np.max(s))<EOL>psigma_diag = <NUM_LIT:1.0> / s[: rank]<EOL>B = np.transpose(np.conjugate(np.dot(u[:, : rank] *<EOL>psigma_diag, vh[: rank])))<EOL>if return_rank:<EOL><INDENT>return B, rank<EOL><DEDENT>else:<EOL><INDENT>return B<EOL><DEDENT>
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 : (M, N) array_like
    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.
return_rank : bool, optional
    if True, return the effective rank of the matrix
check_finite : boolean, optional
    Whether to check that the input matrix contains only finite numbers.
    Disabling may give a performance gain, but may result in problems
    (crashes, non-termination) if the inputs do contain infinities or NaNs.

Returns
-------
B : (N, M) ndarray
    The pseudo-inverse of matrix `a`.
rank : int
    The effective rank of the matrix.  Returned if return_rank == True

Raises
------
LinAlgError
    If SVD computation does not converge.

Examples
--------
>>> a = np.random.randn(9, 6)
>>> B = linalg.pinv2(a)
>>> np.allclose(a, dot(a, dot(B, a)))
True
>>> np.allclose(B, dot(B, dot(a, B)))
True