Main Content

本页翻译不是最新的。点击此处可查看最新英文版本。

svd

奇异值分解

说明

示例

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

示例

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

示例

[___] = svd(A,"econ") 使用上述任一输出参数组合生成 A 的精简分解。如果 Am×n 矩阵,则:

  • 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' 中的那些零值相乘的列。删除这些零值和列可以缩短执行时间,并减少存储要求,而且不会影响分解的准确性。

示例

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

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

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

[___] = svd(___,outputForm) 还可以指定奇异值的输出格式。您可以将此选项与上述任一输入或输出参数组合一起使用。指定 "vector" 以列向量形式返回奇异值,或指定 "matrix" 以对角矩阵形式返回奇异值。

示例

全部折叠

计算满秩矩阵的奇异值。

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' 中的那些零值相乘的相应列。

创建一个 6×6 幻方矩阵并计算 SVD。默认情况下,当您指定多个输出时,svd 以对角矩阵形式返回奇异值。

A = magic(6);
[U,S,V] = svd(A)
U = 6×6

   -0.4082    0.5574    0.0456   -0.4182    0.3092    0.5000
   -0.4082   -0.2312    0.6301   -0.2571   -0.5627   -0.0000
   -0.4082    0.4362    0.2696    0.5391    0.1725   -0.5000
   -0.4082   -0.3954   -0.2422   -0.4590    0.3971   -0.5000
   -0.4082    0.1496   -0.6849    0.0969   -0.5766   -0.0000
   -0.4082   -0.5166   -0.0182    0.4983    0.2604    0.5000

S = 6×6

  111.0000         0         0         0         0         0
         0   50.6802         0         0         0         0
         0         0   34.3839         0         0         0
         0         0         0   10.1449         0         0
         0         0         0         0    5.5985         0
         0         0         0         0         0    0.0000

V = 6×6

   -0.4082    0.6234   -0.3116    0.2495    0.2511   -0.4714
   -0.4082   -0.6282    0.3425    0.1753    0.2617   -0.4714
   -0.4082   -0.4014   -0.7732   -0.0621   -0.1225    0.2357
   -0.4082    0.1498    0.2262   -0.4510    0.5780    0.4714
   -0.4082    0.1163    0.2996    0.6340   -0.3255    0.4714
   -0.4082    0.1401    0.2166   -0.5457   -0.6430   -0.2357

指定 "vector" 选项,以列向量形式返回奇异值。

[U,S,V] = svd(A,"vector")
U = 6×6

   -0.4082    0.5574    0.0456   -0.4182    0.3092    0.5000
   -0.4082   -0.2312    0.6301   -0.2571   -0.5627   -0.0000
   -0.4082    0.4362    0.2696    0.5391    0.1725   -0.5000
   -0.4082   -0.3954   -0.2422   -0.4590    0.3971   -0.5000
   -0.4082    0.1496   -0.6849    0.0969   -0.5766   -0.0000
   -0.4082   -0.5166   -0.0182    0.4983    0.2604    0.5000

S = 6×1

  111.0000
   50.6802
   34.3839
   10.1449
    5.5985
    0.0000

V = 6×6

   -0.4082    0.6234   -0.3116    0.2495    0.2511   -0.4714
   -0.4082   -0.6282    0.3425    0.1753    0.2617   -0.4714
   -0.4082   -0.4014   -0.7732   -0.0621   -0.1225    0.2357
   -0.4082    0.1498    0.2262   -0.4510    0.5780    0.4714
   -0.4082    0.1163    0.2996    0.6340   -0.3255    0.4714
   -0.4082    0.1401    0.2166   -0.5457   -0.6430   -0.2357

如果指定一个输出参数,如 S = svd(A),则 svd 默认情况下会改为以列向量形式返回奇异值。在这种情况下,您可以指定 "matrix" 选项以对角矩阵形式返回奇异值。

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

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
复数支持:

奇异值的输出格式,指定为以下值之一:

  • "vector" - S 是列向量。当您指定一个输出 S = svd(X) 时,这是默认行为。

  • "matrix" - S 是对角矩阵。当您指定多个输出 [U,S,V] = svd(X) 时,这是默认行为。

示例: [U,S,V] = svd(X,"vector")S 以列向量而不是对角矩阵形式返回。

示例: S = svd(X,"matrix")S 以对角矩阵而不是列向量形式返回。

数据类型: char | string

输出参数

全部折叠

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

  • 对于 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' 的值。

奇异值,以对角矩阵或列向量形式返回。奇异值是非负值并以降序顺序返回。

如果 Am×n 矩阵,而 S 是对角矩阵,则 S 的大小如下:

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

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

  • 对于 svd(A,0)

    • 如果 m > n,则 Smin([m,n]) 阶方阵。

    • 如果 m < n,则 S 的大小与 A 相同。

此外,根据您如何调用 svd 以及是否指定 outputForm 选项,S 中的奇异值将以列向量或对角矩阵形式返回:

  • 如果带一个输出调用 svd 或指定了 "vector" 选项,则 S 是列向量。

  • 如果带多个输出调用 svd 或指定了 "matrix" 选项,则 S 是对角矩阵。

根据您指定一个输出还是多个输出,svd 可以返回不同奇异值,这些值在数值上依然精确。

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

  • 对于 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 之前推出

全部展开

另请参阅

| | | | |

主题