# 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) 以满足
• S 是奇异值,以列向量形式返回。奇异值是非负值并以降序顺序返回;
• V 是右奇异向量,以矩阵的列形式返回。
对于完全分解,svd(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。