Mis*_*cht 5 numpy exception svd lapack
我正在使用 numpy.svd 来计算条件不良矩阵的奇异值分解。对于某些特殊情况,svd 不会收敛并引发 Linalg.Error。我做了一些研究,发现 numpy 使用 LAPACK 中的 DGEESDD 例程。标准实现的硬编码迭代限制为 35 次或更多迭代。如果我尝试在 Matlab 中分解相同的矩阵,一切都会正常,我认为有两个原因: 1. Matlab 使用 DGESVD 而不是 DGEESDD,后者通常看起来更稳健。2. Matlab 在例程中使用 75 次迭代限制。(他们在源代码中更改了它并重新编译了它。)
现在的问题是:是否有一种简单的方法可以将 numpy 中使用的后端从 DGEESDD 更改为 DGESVD,而无需修改 numpy 源?
预先感谢米莎
小智 0
我有点晚了,但这也许对其他人有帮助......
我在朱莉娅身上也遇到了类似的问题。
我从 R 帮助列表中找到了这种方法,它应该适用于使用 lapack 库的任何环境:
基本上,如果 svd(M) 失败,请尝试 svd(M'),并适当交换生成的 U、V。
这是我在朱莉娅中的做法:
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1377 次 |
| 最近记录: |