svd
奇异值分解
说明
[___] = svd(
使用上述任一输出参量组合生成 A
,"econ")A
的精简分解。如果 A
是 m
×n
矩阵,则:
m > n
- 只计算U
的前n
列,S
是一个n
×n
矩阵。m = n
-svd(A,"econ")
等效于svd(A)
。m < n
- 只计算V
的前m
列,S
是一个m
×m
矩阵。
精简分解从奇异值的对角矩阵 S
中删除额外的零值行或列,以及 U
或 V
中与表达式 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)
。
不建议使用此语法。改用 "econ"
选项。
[___] = 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
函数 rank
、orth
和 null
为计算这些数量提供了便捷方法。
输入参数
A
— 输入矩阵
矩阵
输入矩阵。A
可以是方阵或矩形矩阵。
数据类型: single
| double
复数支持: 是
outputForm
— 奇异值的输出格式
"vector"
| "matrix"
奇异值的输出格式,指定为以下值之一:
"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
输出参量
U
— 左奇异向量
矩阵
左奇异向量,以矩阵的列形式返回。
对于
m > n
的m
×n
矩阵A
,精简分解svd(A,"econ")
只计算U
的前n
列。在这种情况下,U
的列正交,U
是一个满足 的m
×n
矩阵。对于完全分解,
svd(A)
以满足 的m
×m
酉矩阵形式返回U
。U
中有对应的非零奇异值的列为A
的范围形成一组标准正交基向量。
不同的计算机和 MATLAB® 版本可以生成不同的奇异向量,它们在数值上依然精确。U
和 V
中的相应列可以翻转其符号,因为这不会影响表达式 A = U*S*V'
的值。
S
— 奇异值
对角矩阵 | 列向量
奇异值,以对角矩阵或列向量形式返回。奇异值是非负值并以降序顺序返回。
如果 A
是 m
×n
矩阵,而 S
是对角矩阵,则 S
的大小如下:
精简分解
svd(A,"econ")
将以min([m,n])
阶方阵形式返回S
。对于完全分解,
svd(A)
返回与A
大小相同的S
。
此外,根据您如何调用 svd
以及是否指定 outputForm
选项,S
中的奇异值将以列向量或对角矩阵形式返回:
如果带一个输出调用
svd
或指定了"vector"
选项,则S
是列向量。如果带多个输出调用
svd
或指定了"matrix"
选项,则S
是对角矩阵。
根据您指定一个输出还是多个输出,svd
可以返回不同奇异值,这些值在数值上依然精确。
V
— 右奇异向量
矩阵
右奇异向量,以矩阵的列形式返回。
对于
m < n
的m
×n
矩阵A
,精简分解svd(A,"econ")
只计算V
的前m
列。在这种情况下,V
的列正交,V
是一个满足 的n
×m
矩阵。对于完全分解,
svd(A)
以满足 的n
×n
酉矩阵形式返回V
。V
中没有对应的非零奇异值的列为A
的零空间形成一组标准正交基向量。
不同的计算机和 MATLAB 版本可以生成不同的奇异向量,它们在数值上依然精确。U
和 V
中的相应列可以翻转其符号,因为这不会影响表达式 A = U*S*V'
的值。
扩展功能
tall 数组
对行数太多而无法放入内存的数组进行计算。
用法说明和限制:
不支持有三个输出的语法
[U,S,V] = svd(X)
。对于三个输出,必须指定svd(X,"econ")
,"vector"
或"matrix"
为可选项。对于一个输出的
s = svd(X,...)
,奇异值必须以向量形式返回,除非您指定"econ"
。
有关详细信息,请参阅tall 数组。
C/C++ 代码生成
使用 MATLAB® Coder™ 生成 C 代码和 C++ 代码。
用法说明和限制:
代码生成使用与 MATLAB 不同的
SVD
实现。由于奇异值分解不是唯一的,所以左右奇异向量可能与 MATLAB 计算的不同。代码生成不支持对此函数使用稀疏矩阵输入。
GPU 代码生成
使用 GPU Coder™ 为 NVIDIA® GPU 生成 CUDA® 代码。
用法说明和限制:
代码生成使用与 MATLAB 不同的
SVD
实现。由于奇异值分解不是唯一的,所以左右奇异向量可能与 MATLAB 计算的不同。当输入矩阵包含非有限值时,生成的代码不会引发错误,而是在输出中包含
NaN
值。代码生成不支持对此函数使用稀疏矩阵输入。
基于线程的环境
使用 MATLAB® backgroundPool
在后台运行代码或使用 Parallel Computing Toolbox™ ThreadPool
加快代码运行速度。
此函数完全支持基于线程的环境。有关详细信息,请参阅在基于线程的环境中运行 MATLAB 函数。
GPU 数组
通过使用 Parallel Computing Toolbox™ 在图形处理单元 (GPU) 上运行来加快代码执行。
svd
函数完全支持 GPU 数组。要在 GPU 上运行该函数,请将输入数据指定为 gpuArray
(Parallel Computing Toolbox)。有关详细信息,请参阅Run MATLAB Functions on a GPU (Parallel Computing Toolbox)。
分布式数组
使用 Parallel Computing Toolbox™ 在集群的组合内存中对大型数组进行分区。
用法说明和限制:
如果输入矩阵
A
是矩形矩阵,则必须使用"econ"
选项指定精简分解。
有关详细信息,请参阅Run MATLAB Functions with Distributed Arrays (Parallel Computing Toolbox)。
版本历史记录
在 R2006a 之前推出R2022b: 精简分解不推荐使用“0”语法
将继续支持语法 [___] = svd(A,0)
,但不再推荐使用。请改用 "econ"
选项来执行精简分解。
R2021b: 指定输出格式
将 outputForm
指定为 "vector"
或 "matrix"
,以控制 svd
是以向量还是矩阵形式返回输出参量。对于大型分解,将输出作为向量返回可以节省内存并提高效率。
R2021b: svd
在输入为非有限时返回 NaN
当输入包含非有限值(Inf
或 NaN
)时,svd
返回 NaN
值。以前,svd
在输入包含非有限值时会引发错误。
MATLAB 命令
您点击的链接对应于以下 MATLAB 命令:
请在 MATLAB 命令行窗口中直接输入以执行命令。Web 浏览器不支持 MATLAB 命令。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)