查看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我正在使用英特尔MKL的EPD。然而,考虑到scipy.linalg (独立于分布)总是包含solveh_banded,但没有三对角线求解器,我认为它肯定比EPD/MKL问题更深。
发布于 2012-04-20 22:56:48
并不是所有的Lapack都暴露在scipy中。
如果一个函数没有公开,那么很可能是因为没有人需要它,或者因为没有人需要它,包装器写道。
作为示例,下面是几个公开其他功能的pull请求
https://github.com/scipy/scipy/pull/124
https://github.com/scipy/scipy/pull/76
https://github.com/scipy/scipy/pull/185
我不知道如何在github上找到solveh_banded的初始提交。
https://stackoverflow.com/questions/10237777
复制相似问题