def pinvh(a, cond=None, rcond=None, lower=True, return_rank=False,<EOL>check_finite=True):
if check_finite:<EOL><INDENT>a = np.asarray_chkfinite(a)<EOL><DEDENT>else:<EOL><INDENT>a = np.asarray(a)<EOL><DEDENT>s, u = decomp.eigh(a, lower=lower, 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>above_cutoff = (abs(s) > cond * np.max(abs(s)))<EOL>psigma_diag = <NUM_LIT:1.0> / s[above_cutoff]<EOL>u = u[:, above_cutoff]<EOL>B = np.dot(u * psigma_diag, np.conjugate(u).T)<EOL>if return_rank:<EOL><INDENT>return B, len(psigma_diag)<EOL><DEDENT>else:<EOL><INDENT>return B<EOL><DEDENT>
Compute the (Moore-Penrose) pseudo-inverse of a Hermitian matrix.

Calculate a generalized inverse of a Hermitian or real symmetric matrix
using its eigenvalue decomposition and including all eigenvalues with
'large' absolute value.

Parameters
----------
a : (N, N) array_like
    Real symmetric or complex hermetian matrix to be pseudo-inverted
cond, rcond : float or None
    Cutoff for 'small' eigenvalues.
    Singular values smaller than rcond * largest_eigenvalue are considered
    zero.

    If None or -1, suitable machine precision is used.
lower : bool
    Whether the pertinent array data is taken from the lower or upper
    triangle of a. (Default: lower)
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, N) ndarray
    The pseudo-inverse of matrix `a`.
rank : int
    The effective rank of the matrix.  Returned if return_rank == True

Raises
------
LinAlgError
    If eigenvalue does not converge

Examples
--------
>>> import numpy as np
>>> a = np.random.randn(9, 6)
>>> a = np.dot(a, a.T)
>>> B = pinvh(a)
>>> np.allclose(a, np.dot(a, np.dot(B, a)))
True
>>> np.allclose(B, np.dot(B, np.dot(a, B)))
True