2024-05-29 11:05:31 发布
网友
在这里研究矩阵代数。有时我需要反转一个可能是奇异的或病态的矩阵。我知道简单地这样做是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
纳姆比·利纳格是不是在我被禁止的测试之前就做了?
你应该计算矩阵的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的评论
基于这里的输入,我用显式测试作为解决方案标记我的原始代码块:
令人惊讶的是,numpy.linalg.inv函数没有执行此测试。我检查了代码,发现它通过了所有它的阴谋,然后只是调用lapack例程-似乎相当低效。另外,我将第二个由DaveP提出的观点:除非明确需要,否则不应计算矩阵的逆。
你应该计算矩阵的condition number,看看它是否可逆。
你的第一个解决方案捕捉到了这样一个情况:你的矩阵是如此的奇异以至于numpy根本无法处理——这可能是一个非常极端的情况。你的第二个解决方案更好,因为它捕捉到了numpy给出答案的情况,但是这个答案有可能被舍入误差破坏——这看起来更合理。
如果试图反转病态矩阵,则应考虑使用singular value decomposition。如果仔细使用,它可以给你一个合理的答案,在其他程序失败。
如果您不想要SVD,请参阅我关于使用lu_factor而不是inv的评论
基于这里的输入,我用显式测试作为解决方案标记我的原始代码块:
令人惊讶的是,numpy.linalg.inv函数没有执行此测试。我检查了代码,发现它通过了所有它的阴谋,然后只是调用lapack例程-似乎相当低效。另外,我将第二个由DaveP提出的观点:除非明确需要,否则不应计算矩阵的逆。
相关问题 更多 >
编程相关推荐