Python 为什么scipy暴露Lapack pbsv(b为带状,例如linalg.solveh_带状)而不暴露ptsv(t为三对角)?

Python 为什么scipy暴露Lapack pbsv(b为带状,例如linalg.solveh_带状)而不暴露ptsv(t为三对角)?,python,scipy,lapack,enthought,intel-mkl,Python,Scipy,Lapack,Enthought,Intel Mkl,从scipy.linalg.solveh_banded的来源来看,它只是包装了Lapack pbsv。我正在寻找一个更有效的三对角(埃尔米特,或者在我的例子中是真正的对称)系统的解算器,我认为应该由Lapack ptsv函数提供。此外,如果主对角线上的(所有正)值的动态范围过大,solveh_banded将崩溃,即使这不应该是一个实际问题(我猜舍入使最小值看起来实际上是负的,因此它被视为具有负特征值)而且有可能一个三对角的特定程序不会解决这个问题 从我对Lapack的阅读来看,似乎ptsv应该包

从scipy.linalg.solveh_banded的来源来看,它只是包装了Lapack pbsv。我正在寻找一个更有效的三对角(埃尔米特,或者在我的例子中是真正的对称)系统的解算器,我认为应该由Lapack ptsv函数提供。此外,如果主对角线上的(所有正)值的动态范围过大,solveh_banded将崩溃,即使这不应该是一个实际问题(我猜舍入使最小值看起来实际上是负的,因此它被视为具有负特征值)而且有可能一个三对角的特定程序不会解决这个问题

从我对Lapack的阅读来看,似乎ptsv应该包含在任何有pbsv的发行版中(文档总是将它们列在一起)。我不确定哪一个更有效(pbsv假设对称但带宽任意,而ptsv假设三对角但不一定对称),但似乎值得尝试ptsv

不幸的是,ptsv似乎没有暴露在scipy中,我相信这实际上意味着它没有包含在scipy.linalg.flapack中,因此无法通过scipy.linalg.get_lapack_funcs(('ptsv',)获得

我知道Fortran/Lapack与scipy的链接很复杂,但是有人知道为什么pbsv和ptsv会被区别对待吗?有什么东西我可以手工编辑来尝试像pbsv一样包装ptsv(不幸的是flapack似乎是以“.so”的形式提供的,所以我陷入了死胡同)


FWIW我正在使用英特尔MKL的热情环保署。然而,鉴于scipy.linalg(独立于分布)始终包含solveh_banded,但没有三对角解算器,我认为它一定比EPD/MKL问题更深刻。

并非所有Lapack都在scipy中公开

“如果一个函数没有公开,那么很可能是因为没有人需要它,或者是因为没有人需要它,”包装器写道

作为示例,下面是几个公开附加函数的pull请求


我不知道如何在github上找到solveh_Band的初始提交。

谢谢,这些提交将我指向flapack.pyf.src,在那里我有一些希望可以模仿pbsv的块并尝试使其为ptsv工作。如果其他人偶然发现这个答案,我可以调用ptsv(和gtsv,它不假定为正定)Lapack函数在Windows和Linux上都使用cvxopt包,并且在带宽没有崩溃的情况下,它们完全同意w/solveh_带宽。