def pinv(a, rcond=1e-15): """Compute the Moore-Penrose pseudoinverse of a matrix. It computes a pseudoinverse of a matrix ``a``, which is a generalization of the inverse matrix with Singular Value Decomposition (SVD). Note that it automatically removes small singular values for stability. Args: a (cupy.ndarray): The matrix with dimension ``(M, N)`` rcond (float): Cutoff parameter for small singular values. For stability it computes the largest singular value denoted by ``s``, and sets all singular values smaller than ``s`` to zero. Returns: cupy.ndarray: The pseudoinverse of ``a`` with dimension ``(N, M)``. .. warning:: This function calls one or more cuSOLVER routine(s) which may yield invalid results if input conditions are not met. To detect these invalid results, you can set the `linalg` configuration to a value that is not `ignore` in :func:`cupyx.errstate` or :func:`cupyx.seterr`. .. seealso:: :func:`numpy.linalg.pinv` """ u, s, vt = decomposition.svd(a, full_matrices=False) cutoff = rcond * s.max() s1 = 1 / s s1[s <= cutoff] = 0 return core.dot(vt.T, s1[:, None] * u.T)
def pinv(a, rcond=1e-15): """Compute the Moore-Penrose pseudoinverse of a matrix. It computes a pseudoinverse of a matrix ``a``, which is a generalization of the inverse matrix with Singular Value Decomposition (SVD). Note that it automatically removes small singular values for stability. Args: a (cupy.ndarray): The matrix with dimension ``(M, N)`` rcond (float): Cutoff parameter for small singular values. For stability it computes the largest singular value denoted by ``s``, and sets all singular values smaller than ``s`` to zero. Returns: cupy.ndarray: The pseudoinverse of ``a`` with dimension ``(N, M)``. .. seealso:: :func:`numpy.linalg.pinv` """ u, s, vt = decomposition.svd(a, full_matrices=False) cutoff = rcond * s.max() s1 = 1 / s s1[s <= cutoff] = 0 return core.dot(vt.T, s1[:, None] * u.T)
def matrix_rank(M, tol=None): """Return matrix rank of array using SVD method Args: M (cupy.ndarray): Input array. Its `ndim` must be less than or equal to 2. tol (None or float): Threshold of singular value of `M`. When `tol` is `None`, and `eps` is the epsilon value for datatype of `M`, then `tol` is set to `S.max() * max(M.shape) * eps`, where `S` is the singular value of `M`. It obeys :func:`numpy.linalg.matrix_rank`. Returns: cupy.ndarray: Rank of `M`. .. seealso:: :func:`numpy.linalg.matrix_rank` """ if M.ndim < 2: return (M != 0).any().astype(int) S = decomposition.svd(M, compute_uv=False) if tol is None: tol = (S.max(axis=-1, keepdims=True) * max(M.shape[-2:]) * numpy.finfo(S.dtype).eps) return (S > tol).sum(axis=-1, dtype=numpy.intp)
def _multi_svd_norm(x, row_axis, col_axis, op): y = cupy.moveaxis(x, (row_axis, col_axis), (-2, -1)) result = op(decomposition.svd(y, compute_uv=False), axis=-1) return result