为什么scipy会暴露Lapack pbsv(b为带状,例如linalg.solveh_banded)而不是ptsv(t为tridiagonal)?

时间:2012-04-19 22:30:33

标签: python scipy lapack enthought intel-mkl

查看scipy.linalg.solveh_banded的来源,它只是包装了Lapack pbsv。我正在寻找一种更有效的三对角(Hermitian,或在我的情况下是真正的对称)系统的求解器,我认为应该由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会被区别对待吗?有什么我可以手工编辑来尝试包装ptsv像pbsv(不幸的是flapack似乎只是作为“.so”提供,所以我遇到了死胡同)?

FWIW我正在使用Enthought EPD和英特尔MKL。但是,鉴于scipy.linalg(独立于分布)总是包含solveh_banded,但没有三角形求解器,我认为它必须比EPD / MKL问题更深。

1 个答案:

答案 0 :(得分:1)

并非所有的Lapack都暴露在scipy中。

如果某个函数没有公开,那很可能是因为没有人需要它,或者因为没有人需要它,所以写了包装器。

作为示例,这里有一些公开其他功能的拉取请求

https://github.com/scipy/scipy/pull/124

https://github.com/scipy/scipy/pull/76

https://github.com/scipy/scipy/pull/185

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