megengine.functional.svd¶
- svd(inp, full_matrices=False, compute_uv=True)[source]¶
Computes the singular value decomposition of a matrix (or a stack of matrices)
inp.Let \(X\) be the input matrix (or a stack of input matrices), the output should satisfies:
\[X = U * diag(S) * Vh\]where
Uis a matrix (or stack of vectors) with orthonormal columns,Sis a vector of non-negative numbers (or stack of vectors), andVhis a matrix (or a stack of matrices) with orthonormal rows.- Parameters
inp (Tensor) – A input real tensor having the shape
(..., M, N)withinp.ndim >= 2.full_matrices (bool, optional) – If
False,UandVhhave the shapes(..., M, K)and(..., K, N), respectively, whereK = min(M, N). IfTrue, the shapes are(..., M, M)and(..., N, N), respectively. Default:False.compute_uv (bool, optional) – Whether or not to compute
UandVhin addition toS. Default:True.
Note
naive does not support
full_matricesandcompute_uvasTrue.
- Return type
- Returns
Returns a tuple (
U,S,Vh), which are SVD factorsU,S,Vhof input matrixinp. (U,Vhonly returned whencompute_uvis True).Ucontains matrices orthonormal columns (i.e., the columns are left singular vectors). Iffull_matricesisTrue, the array must have shape(..., M, M). Iffull_matricesisFalse, the array must have shape(..., M, K), whereK = min(M, N).
Examples
>>> import numpy as np >>> x = Tensor(np.random.randn(9, 6)) >>> y = Tensor(np.random.randn(2, 7, 8, 3)) >>> U, S, Vh = F.svd(x, full_matrices=False) >>> print(U._tuple_shape, S._tuple_shape, Vh._tuple_shape) (9, 6) (6,) (6, 6) >>> u, s, vh = F.svd(y, full_matrices=False) >>> print(u._tuple_shape, s._tuple_shape, vh._tuple_shape) (2, 7, 8, 3) (2, 7, 3) (2, 7, 3, 3)