scipy.linalg.pinvh#
- scipy.linalg.pinvh(a, atol=None, rtol=None, lower=True, return_rank=False, check_finite=True, cond=None, rcond=None)[source]#
Compute the (Moore-Penrose) pseudo-inverse of a Hermitian matrix.
Calculate a generalized inverse of a complex Hermitian/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
- atol: float, optional
Absolute threshold term, default value is 0.
New in version 1.7.0.
- rtol: float, optional
Relative threshold term, default value is
N * eps
whereeps
is the machine precision value of the datatype ofa
.New in version 1.7.0.
- lowerbool, optional
Whether the pertinent array data is taken from the lower or upper triangle of a. (Default: lower)
- return_rankbool, optional
If True, return the effective rank of the matrix.
- check_finitebool, 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.
- cond, rcondfloat, optional
In older versions, these values were meant to be used as
atol
withrtol=0
. If both were givenrcond
overwrotecond
and hence the code was not correct. Thus using these are strongly discouraged and the tolerances above are recommended instead. In fact, if provided, atol, rtol takes precedence over these keywords.Changed in version 1.7.0: Deprecated in favor of
rtol
andatol
parameters above and will be removed in future versions of SciPy.Changed in version 1.3.0: Previously the default cutoff value was just
eps*f
wheref
was1e3
for single precision and1e6
for double precision.
- Returns
- B(N, N) ndarray
The pseudo-inverse of matrix a.
- rankint
The effective rank of the matrix. Returned if return_rank is True.
- Raises
- LinAlgError
If eigenvalue algorithm does not converge.
Examples
>>> from scipy.linalg import pinvh >>> rng = np.random.default_rng() >>> a = rng.standard_normal((9, 6)) >>> a = np.dot(a, a.T) >>> B = pinvh(a) >>> np.allclose(a, a @ B @ a) True >>> np.allclose(B, B @ a @ B) True