2026a

# svd


计算 A 的奇异值分解 (SVD) 并返回一个 SVD 对象

函数库: TyMath

# 语法

U,S,V = svd(A)
U,S,V = svd(A;full = true)
U,V,Q,D1,D2,R0 = svd(A,B)

# 说明

U,S,V = svd(A) 执行矩阵 A 的奇异值分解,因此 示例


U,S,V = svd(A;full = true) 计算 A 的“满”奇异值分解,full 默认为"false"。示例


U,V,Q,D1,D2,R0= svd(A,B) 计算 A 和 B 的广义奇异值分解。示例

提示

不同电脑可能结果有差异。

# 示例

奇异值分解

计算矩阵的奇异值分解。

using TyMath
rng = MT19937ar(1234)
A = rand(rng,4,3);
F = svd(A,full = true)
SVD{Float64, Float64, Matrix{Float64}, Vector{Float64}}
U factor:
4×4 Matrix{Float64}:
 -0.571603  -0.755292   -0.309798  -0.0826452
 -0.511633   0.0239883   0.807393   0.29287
 -0.297185   0.269767    0.132409  -0.906297
 -0.568491   0.596812   -0.484366   0.293296

singular values:
3-element Vector{Float64}:
 2.04798165466409
 0.5514593304311445
 0.447409465446397

Vt factor:
3×3 Matrix{Float64}:
 -0.490395  -0.548502   -0.677243
  0.828831  -0.0533533  -0.55695
  0.269355  -0.834445    0.48078
广义奇异值分解

计算 A 和 B 的广义 SVD,返回一个 GeneralizedSVD 分解对象 F,使得 [A;B] = [F.U * F. D1; F.V * F.D2] * F.R0 * F.Q'

• U 是 M×M 正交矩阵;

• V 是 P×P 正交矩阵;

• Q 是 N×N 正交矩阵;

• D1 是一个 M×(K+L) 对角矩阵,前 K 个条目为 1;

• D2 是一个 P×(K+L) 矩阵,其右上角的 L×L 块是对角线;

• R0 是一个 (K+L)×N 矩阵,其最右边的 (K+L)×(K+L) 块是非奇异上块三角形。

K+L 是矩阵 [A;B]。

迭代分解产生分量 U、V、Q、D1、D2 和 R0。

using TyMath
rng  = MT19937ar(5489)
A = randn(rng,3,2);
B = randn(rng,4,2);
F = svd(A, B);
U,V,Q,D1,D2,R0 = F
GeneralizedSVD{Float64, Matrix{Float64}, Float64, Vector{Float64}}
U factor:
3×3 Matrix{Float64}:
 -0.284704   0.689645  0.665833
 -0.524828  -0.69337   0.493755
  0.802184  -0.208874  0.55935
V factor:
4×4 Matrix{Float64}:
  0.237786  -0.317997   0.740761   0.541857
 -0.421487   0.803515   0.216777   0.360167
 -0.72637   -0.297781   0.430875  -0.44504
 -0.48805   -0.40567   -0.467577   0.615313
Q factor:
2×2 Matrix{Float64}:
 0.833353  -0.552741
 0.552741   0.833353
D1 factor:
3×2 Matrix{Float64}:
 0.571979  0.0
 0.0       0.23479
 0.0       0.0
D2 factor:
4×2 Matrix{Float64}:
 0.820268  0.0
 0.0       0.972046
 0.0       0.0
 0.0       0.0
R0 factor:
2×2 Matrix{Float64}:
 -5.67795  0.69935
  0.0      3.30524
精简分解

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

using TyMath
A = [1 2; 3 4; 5 6; 7 8]
A = 4×2 Matrix{Int64}:
 1  2
 3  4
 5  6
 7  8
U,S,V = svd(A)
SVD{Float64, Float64, Matrix{Float64}, Vector{Float64}}
U factor:
4×2 Matrix{Float64}:
 -0.152483  -0.822647
 -0.349918  -0.421375
 -0.547354  -0.0201031
 -0.744789   0.381169

singular values:
2-element Vector{Float64}:
 14.269095499261486
  0.6268282324175424

Vt factor:
2×2 Matrix{Float64}:
 -0.641423  -0.767187
  0.767187  -0.641423

验证分解的正确性。


A- U * diagm(S) * V'
4×2 Matrix{Float64}:
 -8.88178e-16  -1.33227e-15
  4.44089e-16   0.0        
  1.77636e-15   8.88178e-16
  1.77636e-15   8.88178e-16

可以看出验证结果接近 0 矩阵,说明分解正确。

矩阵的奇异值

计算满秩矩阵的奇异值。

using TyMath
A = [1 0 1;
     -1 -2 0;
     0 1 -1]
3×3 Matrix{Int64}:
  1   0   1
 -1  -2   0
  0   1  -1
s = svd(A)
s = s.S
3-element Vector{Float64}:
 2.460504870018763
 1.6996281482753182
 0.2391232782565544
矩阵的秩、列空间和零空间

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

using TyMath

A = [2 0 2;
     0 1 0;
     0 0 0]
3×3 Matrix{Int64}:
 2  0  2
 0  1  0
 0  0  0
U, S, V = svd(A)
S
3-element Vector{Float64}:
 2.8284271247461903
 1.0
 0.0

# 输入参数

A - 输入矩阵
矩阵

输入矩阵。

数据类型: Int | Float

复数支持:

B - 广义特征值问题输入矩阵
矩阵

广义特征值问题输入矩阵,指定为实数值或复数值方阵。

数据类型: Int | Float

复数支持:

full - 是否输出满 svd 分解结果
Bool

默认值为 false。

数据类型: Bool

# 输出参数

特征值问题输出参数

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

• S 是奇异值,以列向量形式返回。奇异值是非负值并以降序顺序返回;

• V 是右奇异向量,以矩阵的列形式返回。 对于完全分解,svd(A) 以满足 的 n×n 酉矩阵形式返回 V。V 中有对应的非零奇异值的列为 A 的范围形成一组标准正交基向量。

广义特征值问题输出参数

• U 是 M×M 正交矩阵;

• V 是 P×P 正交矩阵;

• Q 是 N×N 正交矩阵;

• D1 是一个 M×(K+L) 对角矩阵,前 K 个条目为 1;

• D2 是一个 P×(K+L) 矩阵,其右上角的 L×L 块是对角线;

• R0 是一个 (K+L)×N 矩阵,其最右边的 (K+L)×(K+L) 块是非奇异上块三角形。

K+L 是矩阵 [A;B]。

迭代分解产生分量 U、V、Q、D1、D2 和 R0。

# 另请参阅

svdvals