Skip to main content
`Ctrl`+`K`
scipy.linalg.

# pinvh

scipy.linalg.pinvh(a, atol=None, rtol=None, lower=True, return_rank=False, check_finite=True)

  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.

  The documentation is written assuming array arguments are of specified “core” shapes. However, array argument(s) of this function may have additional “batch” dimensions prepended to the core shape. In this case, the array is treated as a batch of lower-dimensional slices; see Batched Linear Operations for details.

  Parameters:
    a(N, N) array_like

      Real symmetric or complex hermetian matrix to be pseudo-inverted

    atolfloat, optional

      Absolute threshold term, default value is 0.

      Added in version 1.7.0.

    rtolfloat, optional

      Relative threshold term, default value is `N * eps` where `eps` is the machine precision value of the datatype of `a`.

      Added 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.

  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.

  See also

  `pinv`

    Moore-Penrose pseudoinverse of a matrix.

  Examples

  For a more detailed example see `pinv`.

      >>> import numpy as np
      >>> 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