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)