仅计算广义奇异值(但不计算向量)的快速算法

计算科学 线性代数 matlab 算法 矩阵 svd
2021-12-25 05:26:41

我对仅计算广义奇异值感兴趣,并且想知道这是否比计算完整的 GSVD 更快(以及多少?)。

特别是,我想知道计算广义奇异值的最快算法是什么(理想情况下是对(αi,βi)而不仅仅是σi=αi/βi),给定两个矩阵AB, 在哪里A是大小m×kB是大小n×k? 我还想知道这些算法的运行时间是多少n,m, 和k?

此外,是否有这些算法的任何实现?我知道 Matlab 有一个GSVD 函数,它只能计算奇异值,使用命令:

sigma = gsvd(A,B)

但是,我怀疑它的实现方式是否比使用命令执行完整的 GSVD 更快:

[U,V,X,C,S] = gsvd(A,B)

但是,也许我错了。在 Matlab(或另一种语言)中是否可能有一种方法来计算CS, 并不是U,V, 和X? 如果是这样,那将比计算完整的 GSVD 快多少?

任何/所有这些问题的答案都将不胜感激,甚至是相关的参考资料(因为我见过的大多数算法都计算完整的 GSVD,所以很难找到任何答案,这不是我想要的)。

1个回答

根据http://www.nag.com/numeric/fl/manual/pdf/F08/f08msf.pdf,关于 NAG 库中复杂奇异值/奇异向量的 LAPACK 例程。(不是泛化的,但我认为泛化的想法基本相同。有关真正的 GSVD,请参见http://www.nag.com/numeric/fl/manual/pdf/F08/f08vaf.pdf和http://www。 nag.com/numeric/fl/manual/pdf/F08/f08vnf.pdf用于复杂的 GSVD,但他们没有讨论计算工作量/)

08MSF (CBDSQ/ZBDSQR) 计算已简化为双对角形式的复一般矩阵的奇异值分解。

...

F08MSF (CBDSQR / ZBDSQR) 使用两种不同的算法。如果需要任何奇异向量(即,如果 NCVT > 0 或 NRU > 0 或 NCC > 0),则使用双对角 QR 算法,在零位移和隐式位移形式之间切换以保持小奇异值的准确性,以及在 QR 和 QL 变体之间切换,以便有效地处理分级矩阵(参见 Demmel 和 Kahan(1990))。如果只需要奇异值(即,如果 NCVT = NRU = NCC = 0),则通过微分 qd 算法计算它们(参见 Fernando 和 Parlett (1994)),该算法速度更快,并且可以实现更高的精度。

...

如果仅计算奇异值,则实数浮点运算的总数大致与 n^2 成正比。计算左奇异向量需要大约 12 n^2 * nru 额外操作,计算右奇异向量需要大约 12 n^^2 * ncvt。计算奇异值的操作都必须在标量模式下执行;计算奇异向量的附加操作可以向量化,并且在某些机器上可以更快地执行。该例程的真正模拟是 F08MEF(SBDSQR/DBDSQR)。

请参阅 Demmel 和 Kahan 1990 年的“双对角矩阵的准确奇异值” http://www.netlib.org/lapack/lawnspdf/lawn03.pdf讨论为什么奇异值加向量比仅奇异值花费更长的时间。这是因为奇异向量比奇异值收敛得更慢。表 2 显示了在有和没有奇异向量的情况下比较的一些时序结果。

这是我在 8 核机器上使用 MATLAB R2014A WIN64 运行的一些快速计时结果”

>> n=4000;A=randn(n);B=randn(n);tic,sigma = gsvd(A,B);toc,tic,[U,V,X,C,S] = gsvd(A,B);toc
Elapsed time is 31.649874 seconds.
Elapsed time is 33.202460 seconds.

其他一些运行给出了类似的结果,当第二次运行时,非奇异向量版本的速度仍然快了大约相同的数量(检查以防处理器过热并且不得不降低涡轮水平以进行第二次计算)。MATLAB 使用了多个内核。

n = 1000;非奇异向量版本的平均时间比奇异向量长约 8%。我不知道为什么。

我并不是说 A 和 B 的方阵 randn 代表您关心的问题,但您可以自己尝试 A 和 B。