如何知道 Scipy 的 eig 函数使用了哪个 LAPACK 的函数?

计算科学 矩阵 特征值 scipy 拉帕克
2021-11-30 03:48:21

据我了解,scipy.linalg.eig使用包装器scipy.lapack计算矩阵的特征值和特征向量。为了做到这一点,eig测试矩阵选择好的 LAPACK 函数。如果我错了,请纠正我。

当矩阵是奇异的并且算法不收敛时,Python 会引发错误并显示所使用的 LAPACK 函数的名称。我想知道eig在计算矩阵的特征值时使用哪种算法。是否有任何我不知道的scipy功能或选项显示使用的 LAPACK 功能?eig

1个回答

我认为没有办法在运行时使用scipy.linalg.

根据您的目标,您可以:

  • 阅读源代码并从那里推断出逻辑。不幸的是,这不是运行时使用场景,而是人工分析。
  • 分叉您自己的版本scipy,添加自定义输出(到您有兴趣监视的调用)并使用它而不是随附的输出。由于scipy是开源的,通过一些手动工作,您可以获得所需的行为。在这种情况下,从源参考构建 scipy应该很有用。

关于scipy.linalg.eig:此功能适用于一般矩阵。如果您碰巧有一个对称/厄米特矩阵、带状矩阵或三对角矩阵,则应分别调用scipy.linalg.eighscipy.linalg_eig_bandedscipy.linalg.eigh_tridiagonal

您可以看到,scipy.linalg.eig 它不会对要使用的 LAPACK 函数进行任何选择:

geev, geev_lwork = get_lapack_funcs(('geev', 'geev_lwork'), (a1,))

因此,scipy.linalg.eig将调用?geev我认为它在物理上(就当前实现而言)没有能力调用其他任何东西。

相反,scipy.linalg.eigh有更多的选择和灵活性,实际上可以从scipy.


请注意,目前,您可能会看到scipy.linalg.LinAlgError的输出。此异常在线性代数函数包装器中引发,并且可能使用info来自调用的 LAPACK 函数的输出。