奇异矩阵的高效pythonic检验

2024-05-29 11:05:31 发布

您现在位置:Python中文网/ 问答频道 /正文

在这里研究矩阵代数。有时我需要反转一个可能是奇异的或病态的矩阵。我知道简单地这样做是Python:

try:
    i = linalg.inv(x)
except LinAlgErr as err:
    #handle it

但我不确定这有多有效。这样不是更好吗?

if linalg.cond(x) < 1/sys.float_info.epsilon:
    i = linalg.inv(x)
else:
    #handle it

纳姆比·利纳格是不是在我被禁止的测试之前就做了?


Tags: ifassysit矩阵病态errhandle
3条回答

你应该计算矩阵的condition number,看看它是否可逆。

import numpy.linalg

if numpy.isfinite(numpy.linalg.cond(A)):
    B = numpy.linalg.inv(A)
else:
    # handle it

你的第一个解决方案捕捉到了这样一个情况:你的矩阵是如此的奇异以至于numpy根本无法处理——这可能是一个非常极端的情况。你的第二个解决方案更好,因为它捕捉到了numpy给出答案的情况,但是这个答案有可能被舍入误差破坏——这看起来更合理。

如果试图反转病态矩阵,则应考虑使用singular value decomposition。如果仔细使用,它可以给你一个合理的答案,在其他程序失败。

如果您不想要SVD,请参阅我关于使用lu_factor而不是inv的评论

基于这里的输入,我用显式测试作为解决方案标记我的原始代码块:

if linalg.cond(x) < 1/sys.float_info.epsilon:
    i = linalg.inv(x)
else:
    #handle it

令人惊讶的是,numpy.linalg.inv函数没有执行此测试。我检查了代码,发现它通过了所有它的阴谋,然后只是调用lapack例程-似乎相当低效。另外,我将第二个由DaveP提出的观点:除非明确需要,否则不应计算矩阵的逆。

相关问题 更多 >

    热门问题