本页对应的英文页面已更新,但尚未翻译。 若要查看最新内容,请点击此处访问英文页面。

svd

奇异值分解

说明

示例

s = svd(A) 以降序顺序返回矩阵 A奇异值

示例

[U,S,V] = svd(A) 执行矩阵 A 的奇异值分解,因此 A = U*S*V'

示例

[U,S,V] = svd(A,'econ')m×n 矩阵 A 生成精简分解:

  • m > n - 只计算 U 的前 n 列,S 是一个 n×n 矩阵。

  • m = n - svd(A,'econ') 等效于 svd(A)

  • m < n - 只计算 V 的前 m 列,S 是一个 m×m 矩阵。

精简分解从奇异值的对角矩阵 S 中删除额外的零值行或列,以及 UV 中与表达式 A = U*S*V' 中的那些零值相乘的列。删除这些零值和列可以缩短执行时间,并减少存储要求,而且不会影响分解的准确性。

示例

[U,S,V] = svd(A,0)m×n 矩阵 A 生成另一种精简分解:

  • m > n - svd(A,0) 等效于 svd(A,'econ')

  • m <= n - svd(A,0) 等效于 svd(A)

示例

全部折叠

计算满秩矩阵的奇异值。

A = [1 0 1; -1 -2 0; 0 1 -1]
A = 3×3

     1     0     1
    -1    -2     0
     0     1    -1

s = svd(A)
s = 3×1

    2.4605
    1.6996
    0.2391

求矩形矩阵 A 的奇异值分解。

A = [1 2; 3 4; 5 6; 7 8]
A = 4×2

     1     2
     3     4
     5     6
     7     8

[U,S,V] = svd(A)
U = 4×4

   -0.1525   -0.8226   -0.3945   -0.3800
   -0.3499   -0.4214    0.2428    0.8007
   -0.5474   -0.0201    0.6979   -0.4614
   -0.7448    0.3812   -0.5462    0.0407

S = 4×2

   14.2691         0
         0    0.6268
         0         0
         0         0

V = 2×2

   -0.6414    0.7672
   -0.7672   -0.6414

在计算机精度范围内确认关系 A = U*S*V'

U*S*V'
ans = 4×2

    1.0000    2.0000
    3.0000    4.0000
    5.0000    6.0000
    7.0000    8.0000

计算矩形矩阵的完整和精简分解。

A = [1 2; 3 4; 5 6; 7 8]
A = 4×2

     1     2
     3     4
     5     6
     7     8

[U,S,V] = svd(A)
U = 4×4

   -0.1525   -0.8226   -0.3945   -0.3800
   -0.3499   -0.4214    0.2428    0.8007
   -0.5474   -0.0201    0.6979   -0.4614
   -0.7448    0.3812   -0.5462    0.0407

S = 4×2

   14.2691         0
         0    0.6268
         0         0
         0         0

V = 2×2

   -0.6414    0.7672
   -0.7672   -0.6414

[U,S,V] = svd(A,'econ')
U = 4×2

   -0.1525   -0.8226
   -0.3499   -0.4214
   -0.5474   -0.0201
   -0.7448    0.3812

S = 2×2

   14.2691         0
         0    0.6268

V = 2×2

   -0.6414    0.7672
   -0.7672   -0.6414

由于 A 是 4×2 矩阵,因此与完整分解相比,svd(A,'econ')U 中返回更少的列数,在 S 中返回更少的行数。排除 S 中的额外零值行以及 U 中与表达式 A = U*S*V' 中的那些零值相乘的相应列。

使用奇异值分解结果来确定矩阵的秩、列空间和零空间。

A = [2 0 2; 0 1 0; 0 0 0]
A = 3×3

     2     0     2
     0     1     0
     0     0     0

[U,S,V] = svd(A)
U = 3×3

     1     0     0
     0     1     0
     0     0     1

S = 3×3

    2.8284         0         0
         0    1.0000         0
         0         0         0

V = 3×3

    0.7071         0   -0.7071
         0    1.0000         0
    0.7071         0    0.7071

使用非零奇异值个数计算秩。

s = diag(S);
rank_A = nnz(s)
rank_A = 2

使用 U 中有对应的非零奇异值的列来计算 A 的列空间的标准正交基。

column_basis = U(:,logical(s))
column_basis = 3×2

     1     0
     0     1
     0     0

使用 V 中有对应的零奇异值的列来计算 A 的零空间的标准正交基。

null_basis = V(:,~s)
null_basis = 3×1

   -0.7071
         0
    0.7071

函数 rankorthnull 为计算这些数量提供了便捷方法。

输入参数

全部折叠

输入矩阵。A 可以是方阵或矩形矩阵。

数据类型: single | double
复数支持:

输出参数

全部折叠

奇异值,以列向量形式返回。奇异值是以降序顺序列出的非负实数。

左奇异向量,以矩阵的列形式返回。

  • 对于 m > nm×n 矩阵 A,精简分解 svd(A,'econ')svd(A,0) 只计算 U 的前 n 列。在这种情况下,U 的列正交,U 是一个满足 UHU=Inm×n 矩阵。

  • 对于完整分解,svd(A) 以满足 UUH=UHU=Imm×m 酉矩阵形式返回 UU 中有对应的非零奇异值的列为 A 的范围形成一组标准正交基向量。

不同的计算机和 MATLAB® 版本可以生成不同的奇异向量,它们在数值上依然精确。UV 中的相应列可以翻转其符号,因为这不会影响表达式 A = U*S*V' 的值。

奇异值,以对角矩阵形式返回。S 的对角元素是以降序排列的非负奇异值。S 的大小如下:

  • 对于 m×n 矩阵 A,精简分解 svd(A,'econ') 将以 min([m,n]) 阶方阵形式返回 S

  • 对于完整分解,svd(A) 将返回大小与 A 相同的 S

  • 如果 m > nsvd(A,0) 将以 min([m,n]) 阶方阵形式返回 S

  • 如果 m < nsvd(A,0) 将返回大小与 A 相同的 S

右奇异向量,以矩阵的列形式返回。

  • 对于 m < nm×n 矩阵 A,精简分解 svd(A,'econ') 只计算 V 的前 m 列。在这种情况下,V 的列正交,V 是一个满足 VHV=Imn×m 矩阵。

  • 对于完整分解,svd(A) 以满足 VVH=VHV=Inn×n 酉矩阵形式返回 VV没有对应的非零奇异值的列为 A 的零空间形成一组标准正交基向量。

不同的计算机和 MATLAB 版本可以生成不同的奇异向量,它们在数值上依然精确。UV 中的相应列可以翻转其符号,因为这不会影响表达式 A = U*S*V' 的值。

扩展功能

另请参阅

| | | |

主题

在 R2006a 之前推出