主要内容

圣言会

奇异值和向量的子集

描述

例子

年代=圣言(一个返回一个矩阵的六个最大奇异值的向量一个.这在计算所有奇异值时非常有用圣言会计算开销大,例如使用大型稀疏矩阵。

例子

年代=圣言(一个k返回k最大奇异值。

例子

年代=圣言(一个kσ返回k基于的值的奇异值σ.例如,圣言(k“最小”)返回k最小奇异值。

年代=圣言(一个kσ名称,值使用一个或多个名称-值对参数指定其他选项。例如,圣言(k,σ,“宽容”,1 e - 3)调整算法的收敛容差。

例子

年代=圣言(一个kσ选择使用结构指定选项。

例子

年代=圣言(Afunn___指定函数句柄Afun而不是矩阵。第二个输入n给出了矩阵的大小一个中使用的Afun.您可以选择指定kσ选择,或名称-值对作为额外的输入参数。

例子

U年代V= svds(___返回左奇异向量U,对角矩阵年代奇异值,和右奇异向量V.您可以使用以前语法中的任何输入参数组合。

例子

U年代V国旗= svds(___还返回一个收敛标志。如果国旗0,则所有奇异值收敛。

例子

全部折叠

矩阵A = delsq(numgrid('C',15))是一个奇异值在区间(0 8)合理分布的对称正定矩阵。计算6个最大奇异值。

A = delsq(numgrid(“C”、15));s = svds(A)
s =6×17.8666 7.7324 7.6531 7.5213 7.4480 7.3517

指定第二个输入来计算特定数量的最大奇异值。

s = svds(A,3)
s =3×17.8666 7.7324 7.6531

矩阵A = delsq(numgrid('C',15))是一个奇异值在区间(0 8)合理分布的对称正定矩阵。计算5个最小奇异值。

A = delsq(numgrid(“C”、15));s = svds(A,5,“最小”
s =5×10.5520 0.4787 0.3469 0.2676 0.1334

创建一个稀疏的100 × 100诺伊曼矩阵。

C =画廊(“纽曼”, 100);

计算10个最小的奇异值。

ss = svds(C,10,“最小”
党卫军=10×10.9828 0.9049 0.5625 0.5625 0.4541 0.4506 0.2256 0.1139 0.1139 0

计算10个最小的非零奇异值。由于矩阵有一个奇异值等于0,所以“smallestnz”选项省略了它。

snz = svds(C,10,“smallestnz”
snz =10×10.9828 0.9828 0.9049 0.5625 0.5625 0.4541 0.4506 0.2256 0.1139 0.1139

创建两个矩阵,表示稀疏矩阵中的右上和左下非零块。

N = 500;B =兰特(500);C =兰特(500);

保存Afun在当前目录中,以便可以使用圣言会

函数y = Afun(x,tflag,B,C,n)如果比较字符串(tflag“notransp”) y = [B*x(n+1:结束);C * x (1: n)];其他的y = [C'*x(n+1:end);B * x (1: n)];结束

这个函数Afun使用B而且C都要计算* x‘* x(取决于指定的标志)而不实际形成整个稀疏矩阵A =[零(n) B;C 0 (n)).这利用了矩阵的稀疏模式来节省计算的内存* x而且‘* x

使用Afun计算的10个最大奇异值一个.通过BC,n作为额外的输入Afun

s =圣言(@ (x, tflag) Afun (x, tflag, B, C, n), (1000 1000), 10)
S = 250.3248 249.9914 12.7627 12.7232 12.6988 12.6608 12.6166 12.5643 12.5419 12.4512

直接计算的10个最大奇异值一个比较结果。

A =[零(n) B;C 0 (n)];s = svds(A,10)
S = 250.3248 249.9914 12.7627 12.7232 12.6988 12.6608 12.6166 12.5643 12.5419 12.4512

west0479是一个实值479 × 479的稀疏矩阵。矩阵有几个大的奇异值,和许多小的奇异值。

负载west0479并将其存储为一个

负载west0479A = west0479;

计算的奇异值分解一个,返回六个最大奇异值和相应的奇异向量。指定第四个输出参数以检查奇异值的收敛性。

[U,S,V,cflag] = svds(A);添加
Cflag = 0

添加表示所有奇异值都收敛。奇异值在输出矩阵的对角线上年代

s = diag(s)
s =6×1105× 3.1895 3.1725 3.1695 3.1685 3.1669 0.3038

的全奇异值分解,检验结果一个.转换一个到一个完整的矩阵并使用圣言会

[U1,S1,V1] = svd(满(A));

的六个最大奇异值一个计算圣言会而且圣言会使用对数刻度。

s2 = diag(S1);semilogy (s2 (1:6),“r”。)举行semilogy(年代,“罗”“MarkerSize”10)标题(“west0479的奇异值”)传说(“圣言”“圣言”

图中包含一个轴对象。标题为Singular Values west0479的axes对象包含2个类型为line的对象。这些对象表示svd, svds。

创建一个稀疏对角矩阵并计算六个最大的奇异值。

A = diag(稀疏([1e4*ones(1,8) 1e4:-1:1]));s = svds(A)
警告:请求的6个奇异值中只有2个收敛。不收敛的奇异值为NaN。
s =6×1104× 1.0000 0.9999楠楠楠楠

圣言会算法产生一个警告,因为执行了最大迭代次数,但不能满足公差。

解决收敛问题最有效的方法是通过使用更大的值来增加计算中使用的克雷洛夫子空间的最大大小“SubspaceDimension”.通过传入名称-值对来做到这一点吗“SubspaceDimension”值为60

s = svds(A,6,“最大”“SubspaceDimension”、60)
s =6×1104× 1.0000 1.0000 1.0000 1.0000 1.0000

计算一个近似奇异矩阵的10个最小奇异值。

rng默认的格式shortgB = spdigs ([1;1 e],[2] 198年)(200,1)],[0,1],200年,200年);s1 = svds(B,10,“最小”
警告:检测到大残留模数。这可能是由于输入矩阵的恶劣条件(条件号1.0008e+16)。
s1 =10×17.0945 7.0945 7.0945 7.0945 7.0945 7.0945 7.0945 0.2593 0.0000

该警告表明圣言会无法计算正确的奇异值。失败的是圣言会是由于最小奇异值和次小奇异值之间的差距。圣言(…,“最小”)需要反转B,这将导致较大的数值误差。

为了进行比较,请使用圣言会

s = svd(full(B));S = S (end-9:end)
s =10×10.1420 0.1262 0.1105 0.0947 0.0789 0.0631 0.0474 0.0316 0.0158 0.0000

为了重现这个计算圣言会,做QR分解B.三角形矩阵的奇异值R和for一样吗B

[Q,R,p] = qr(B,0);

的每一行的范数R

rownormR =√(diag(R*R'));semilogy (rownormR);semilogy(size(R, 1), rownormR(end),“罗”

图中包含一个轴对象。axis对象包含2个line类型的对象。

最后一项R接近于零,这导致溶液不稳定。

的最后一行,防止该条目破坏解决方案的良好部分R等于零。

R(end,:) = 0;

使用圣言会求最小的10个奇异值R.所得结果与圣言会

sr = svds(R,10,“最小”
sr =10×10.1420 0.1262 0.1105 0.0947 0.0789 0.0631 0.0474 0.0316 0.0158 0

来计算的奇异向量B用这个方法,变换左右奇异向量还有这个排列向量p

[U,S,V] = svds(R,20,“年代”);U = q *U;V(p,:) = V;

输入参数

全部折叠

输入矩阵。一个是典型的(但不总是)大而稀疏的矩阵。

数据类型:
复数支持:金宝app是的

要计算的奇异值数,指定为正标量整数。圣言会如果满足以下任一条件,返回的奇异值比要求的要少:

  • k大于min(大小(A))

  • Sigma = ' smallstnz '而且k大于的非零奇异值的个数一个

如果k太大了吗圣言会的最大有效值替换它k

例子:圣言(2)的两个最大奇异值一个

奇异值的类型,指定为这些值之一。

选项 描述

“最大”(默认)

最大奇异值

“最小”

最小奇异值

“smallestnz”

最小非零奇异值

标量

最接近标量的奇异值

例子:圣言(k“最小”)计算k最小奇异值。

例子:圣言(k, 100)计算k最接近的奇异值One hundred.

数据类型:|字符|字符串

选项结构,指定为包含此表中的一个或多个字段的结构。

请注意

不建议使用options结构来指定选项。请改用名称-值对。

选择字段 描述 名称-值对
托尔

收敛公差

“宽容”
麦克斯特

最大迭代次数

“MaxIterations”
p

克雷洛夫子空间的最大大小

“SubspaceDimension”
情况

左起始向量

“LeftStartVector”

右起始向量

“RightStartVector”
disp

诊断信息显示级别

“显示”
失败 输出中非收敛奇异值的处理 “FailureTreatment”

请注意

圣言会忽略选项p当使用数值标量移位时σ

例子:选择。托尔= 1e-6, opts.maxit = 500创建一个为字段设置值的结构托尔而且麦克斯特

数据类型:结构体

矩阵函数,指定为函数句柄。这个函数Afun必须满足这些条件:

  • Afun (x, notransp)接受一个向量x然后返回乘积* x

  • Afun (x,“透明”)接受一个向量x然后返回乘积‘* x

请注意

仅在以下情况下使用函数句柄σ = '最大'(这是默认值)。

例子:圣言(Afun [1000 - 1200])

矩阵大小一个这是由Afun,指定为两个元素大小的向量(mn)

名称-值参数

的可选逗号分隔对名称,值参数。的名字参数名称和价值对应的值。的名字必须出现在引号内。您可以以任意顺序指定多个名称和值对参数Name1, Value1,…,的家

例子:s = svds(A,k,sigma,'公差',1e-10,'MaxIterations',100)放松收敛容差并使用更少的迭代。

收敛容差,指定为由逗号分隔的对组成“宽容”和一个非负实数标量。

例子:s = svds(A,k,sigma,'公差',1e-3)

算法迭代的最大次数,指定为逗号分隔的对,由“MaxIterations”一个正整数。

例子:s = svds(A,k,sigma,'MaxIterations',350)

克雷洛夫子空间的最大大小,指定为由逗号分隔的对组成“SubspaceDimension”和一个非负整数。的“SubspaceDimension”Value必须大于或等于K + 2,在那里k是奇异值的个数。

对于以下问题圣言会的值增大,收敛失败“SubspaceDimension”可以改善收敛行为。

的数值将忽略此选项σ

例子:s = svds(A,k,sigma,'SubspaceDimension',25)

左初始起始向量,指定为逗号分隔的对,由“LeftStartVector”和一个数值向量。

你可以指定“LeftStartVector”“RightStartVector”,但不是两者都有。如果没有指定任何选项,则对于——- - - - - -n矩阵一个,默认为:

  • M < n-左起始矢量设置为randn (m, 1)

  • M >= n-右起始矢量设置为randn (n, 1)

指定不同的随机起始向量的主要原因是为了控制用于生成向量的随机数流。

请注意

圣言会使用私有随机数流以可重复的方式选择起始向量。改变随机数种子可以影响这种使用randn

例子:s = svds(A,k,sigma,'LeftStartVector',randn(m,1))使用从全局随机数流中抽取值的随机起始向量。

数据类型:

右初始起始向量,指定为逗号分隔的对,由“RightStartVector”和一个数值向量。

你可以指定“LeftStartVector”“RightStartVector”,但不是两者都有。如果没有指定任何选项,则对于——- - - - - -n矩阵一个,默认为:

  • M < n-左起始矢量设置为randn (m, 1)

  • M >= n-右起始矢量设置为randn (n, 1)

指定不同的随机起始向量的主要原因是为了控制用于生成向量的随机数流。

请注意

圣言会使用私有随机数流以可重复的方式选择起始向量。改变随机数种子可以影响这种使用randn

例子:s = svds(A,k,sigma,'RightStartVector',randn(n,1))使用从全局随机数流中抽取值的随机起始向量。

数据类型:

非收敛奇异值的处理,指定为由逗号分隔的对组成“FailureTreatment”其中一个选项是:“replacenan”“保持”,或“下降”

的价值“FailureTreatment”确定在输出中如何显示非收敛奇异值。

选项

对产量的影响

“下降”

从输出中删除非收敛奇异值,这可能导致圣言会返回的奇异值比要求的少。的数值的默认值σ

“replacenan”

非收敛奇异值替换为值。这个值是任何时候的默认值σ不是数字。

“保持”

输出中包括非收敛奇异值。

例子:s = svds(A,k,sigma,'FailureTreatment','drop')从输出中移除非收敛的奇异值。

数据类型:字符|字符串

诊断信息显示的切换,指定为真正的0,或1.的值0关闭显示,而值真正的1打开它。

输出参数

全部折叠

奇异值,作为列向量返回。奇异值是按递减顺序列出的非负实数。

左奇异向量,作为矩阵的列返回。如果一个是一个——- - - - - -n矩阵,你要求k那么,奇异值U是一个——- - - - - -k具有标准正交列的矩阵。

不同的机器,MATLAB版本®,或参数(如起始向量和子空间维度)可以产生不同的奇异向量,这些奇异向量在数值上仍然是准确的。中的对应列U而且V可以翻转它们的符号,因为这并不影响表达式的值A = u * s * v '

奇异值,作为对角矩阵返回。的对角线元素年代为非负奇异值。如果一个是一个——- - - - - -n矩阵,你要求k那么,奇异值年代k——- - - - - -k

右奇异向量,作为矩阵的列返回。如果一个是一个——- - - - - -n矩阵,你要求k那么,奇异值V是一个n——- - - - - -k具有标准正交列的矩阵。

不同的机器、MATLAB版本或参数(如起始向量和子空间维度)可以产生不同的奇异向量,它们在数值上仍然是准确的。中的对应列U而且V可以翻转它们的符号,因为这并不影响表达式的值A = u * s * v '

收敛标志,作为标量返回。值为0表示所有奇异值都收敛。否则,不是所有奇异值都收敛。

使用此收敛标志输出将抑制关于收敛失败的警告。

提示

  • svdsketch当你事先不知道用什么等级来指定时有用吗圣言会,但是你知道SVD的近似应该满足什么公差。

  • 圣言会使用私有随机数流生成默认起始向量,以确保跨运行的可再现性。使用设置随机数生成器状态rng在调用之前圣言会不影响输出。

  • 使用圣言会不是寻找小而密集矩阵的少数奇异值的最有效方法。对于这类问题,使用圣言(全(A))可能会快一点。例如,在一个500 × 500矩阵中找到三个奇异值是一个相对较小的问题圣言会易于处理。

  • 如果圣言会的值,从而增加Krylov子空间的大小“SubspaceDimension”.作为次要选项,调整最大迭代次数(“MaxIterations”)和收敛公差(“宽容”)也有助于收敛行为。

  • 增加k有时可以提高性能,特别是当矩阵有重复的奇异值时。

兼容性的考虑

全部展开

R2016a的行为发生了变化

参考文献

[1] Baglama, J.和L. Reichel,“增强隐式重启Lanczos双对角化方法”。SIAM科学计算杂志.Vol. 27, 2005, pp. 19-42。

r.m.拉森。”双对角化和部分正交化。奥胡斯大学计算机科学系“,.Daimi pb-357, 1998。

扩展功能

另请参阅

||

主题

R2006a之前介绍