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
可以是方阵或矩形矩阵。
数据类型: 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 > 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'
的值。
奇异值,以对角矩阵或列向量形式返回。奇异值是非负值并以降序顺序返回。
如果 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
可以返回不同奇异值,这些值在数值上依然精确。
右奇异向量,以矩阵的列形式返回。
对于
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'
的值。
扩展功能
svd
函数支持 tall 数组,但存在以下使用说明和限制:
不支持有三个输出的语法
[U,S,V] = svd(X)
。对于三个输出,必须指定svd(X,"econ")
,"vector"
或"matrix"
为可选项。对于一个输出的
s = svd(X,...)
,奇异值必须以向量形式返回,除非您指定"econ"
。
有关详细信息,请参阅tall 数组。
用法说明和限制:
代码生成使用与 MATLAB 不同的
SVD
实现。由于奇异值分解不是唯一的,所以左右奇异向量可能与 MATLAB 计算的不同。代码生成不支持对此函数使用稀疏矩阵输入。
用法说明和限制:
代码生成使用与 MATLAB 不同的
SVD
实现。由于奇异值分解不是唯一的,所以左右奇异向量可能与 MATLAB 计算的不同。当输入矩阵包含非有限值时,生成的代码不会引发错误,而是在输出中包含
NaN
值。代码生成不支持对此函数使用稀疏矩阵输入。
此函数完全支持基于线程的环境。有关详细信息,请参阅在基于线程的环境中运行 MATLAB 函数。
svd
函数完全支持 GPU 数组。要在 GPU 上运行该函数,请将输入数据指定为 gpuArray
(Parallel Computing Toolbox)。有关详细信息,请参阅在 GPU 上运行 MATLAB 函数 (Parallel Computing Toolbox)。
用法说明和限制:
如果输入矩阵
A
是矩形矩阵,则必须使用"econ"
选项指定精简分解。
有关详细信息,请参阅使用分布式数组运行 MATLAB 函数 (Parallel Computing Toolbox)。
版本历史记录
在 R2006a 之前推出将继续支持语法 [___] = svd(A,0)
,但不再推荐使用。请改用 "econ"
选项来执行精简分解。
将 outputForm
指定为 "vector"
或 "matrix"
,以控制 svd
是以向量还是矩阵形式返回输出参量。对于大型分解,将输出作为向量返回可以节省内存并提高效率。
当输入包含非有限值(Inf
或 NaN
)时,svd
返回 NaN
值。以前,svd
在输入包含非有限值时会引发错误。
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
选择网站
选择网站以获取翻译的可用内容,以及查看当地活动和优惠。根据您的位置,我们建议您选择:。
您也可以从以下列表中选择网站:
如何获得最佳网站性能
选择中国网站(中文或英文)以获得最佳网站性能。其他 MathWorks 国家/地区网站并未针对您所在位置的访问进行优化。
美洲
- América Latina (Español)
- Canada (English)
- United States (English)
欧洲
- 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)