5

我正在使用 numpy.svd 来计算条件不良矩阵的奇异值分解。对于某些特殊情况,svd 不会收敛并引发 Linalg.Error。我做了一些研究,发现 numpy 使用 LAPACK 的 DGESDD 例程。标准实现的硬编码迭代限制为 35 次或其他迭代。如果我尝试在 Matlab 中分解相同的矩阵,一切正常,我认为有两个原因: 1. Matlab 使用 DGESVD 而不是 DGESDD,这通常看起来更健壮。2. Matlab 在例程中使用了 75 次的迭代限制。(他们在源代码中对其进行了更改并重新编译。)

现在的问题是:有没有一种简单的方法可以将 numpy 中使用的后端从 DGESDD 更改为 DGESVD 而无需修改 numpy 源?

在此先感谢米沙

4

2 回答 2

1

对我有用的是只计算该矩阵的“经济规模”SVDX

U,S,V = np.linalg.svd(X, full_matrices=False)
于 2015-10-03T08:44:54.880 回答
0

我有点晚了,但也许这会帮助别人......

我在julia遇到了类似的问题。

从 R 帮助列表中找到了这种方法,它应该适用于使用 lapack 库的任何环境:

基本上,如果 svd(M) 失败,请尝试 svd(M'),并适当地交换结果 U,V。

以下是我在 Julia 中的做法:

try
  U,S,V = svd( E_restricted )
  failed = false
catch
  failed = true
end
if failed
  # try it with matrix transposed
  try
    V,S,U = svd( E_restricted' )
    failed = false
  catch
    failed = true
  end
end
if failed
  error("ERROR: svd(E) and svd(E') failed!")
end
于 2013-04-05T21:21:59.720 回答