scipy.linalg.svdvals

scipy.linalg.svdvals(a, overwrite_a=False, check_finite=True)[源代码]

计算矩阵的奇异值。

参数
a(M,N)类数组

要分解的矩阵。

overwrite_a布尔值,可选

是否覆盖 a ;可以提高性能。默认值为False。

check_finite布尔值,可选

是否检查输入矩阵是否仅包含有限个数字。禁用可能会带来性能提升,但如果输入确实包含无穷大或NAN,则可能会导致问题(崩溃、非终止)。

退货
s(min(M,N),)ndarray

奇异值,按降序排序。

加薪
LinAlgError

如果奇异值分解计算不收敛。

参见

svd

计算矩阵的全奇异值分解。

diagsvd

在给定向量s的情况下,构造Sigma矩阵。

注意事项

svdvals(a) 唯一不同的是 svd(a, compute_uv=False) 通过它对Empty的边缘情况的处理 a ,其中它返回一个空序列:

>>> a = np.empty((0, 2))
>>> from scipy.linalg import svdvals
>>> svdvals(a)
array([], dtype=float64)

示例

>>> from scipy.linalg import svdvals
>>> m = np.array([[1.0, 0.0],
...               [2.0, 3.0],
...               [1.0, 1.0],
...               [0.0, 2.0],
...               [1.0, 0.0]])
>>> svdvals(m)
array([ 4.28091555,  1.63516424])

我们可以验证的最大奇异值 m 通过计算 m.dot(u) 在所有的单位向量上 u 在(x,y)平面上。我们用大样本近似“所有”单位向量。由于线性关系,我们只需要带角的单位矢量 [0,圆周率] 。

>>> t = np.linspace(0, np.pi, 2000)
>>> u = np.array([np.cos(t), np.sin(t)])
>>> np.linalg.norm(m.dot(u), axis=0).max()
4.2809152422538475

p 是秩为1的投影矩阵。用精确算术,它的奇异值为 [1,0,0,0] 。

>>> v = np.array([0.1, 0.3, 0.9, 0.3])
>>> p = np.outer(v, v)
>>> svdvals(p)
array([  1.00000000e+00,   2.02021698e-17,   1.56692500e-17,
         8.15115104e-34])

正交矩阵的奇异值都是1。在这里,我们使用 rvs() 一种方法 scipy.stats.ortho_group

>>> from scipy.stats import ortho_group
>>> orth = ortho_group.rvs(4)
>>> svdvals(orth)
array([ 1.,  1.,  1.,  1.])