【问题标题】:Why does scipy expose Lapack pbsv (b for banded, e.g. linalg.solveh_banded) but not ptsv (t for tridiagonal)?为什么 scipy 暴露 Lapack pbsv(b 表示带状,例如 linalg.solveh_banded)而不暴露 ptsv(t 表示三对角线)?
【发布时间】:2012-04-19 22:30:32
【问题描述】:

查看 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 我将 Enthought EPD 与英特尔 MKL 一起使用。但是,鉴于 scipy.linalg(独立于分布)始终包含 solveh_banded,但没有三对角求解器,我认为它必须比 EPD/MKL 问题更深。

【问题讨论】:

    标签: python scipy lapack enthought intel-mkl


    【解决方案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 的初始提交。

    【讨论】:

    • 谢谢,这些提交将我指向flapack.pyf.src,希望我可以模拟pbsv的块并尝试使其适用于ptsv。
    • 如果其他人偶然发现了这个答案,我可以在 Windows 和 Linux 上使用 cvxopt 包调用 ptsv(和不假定肯定的 gtsv)Lapack 函数,并且他们完全同意 w/在带状不崩溃的情况下求解h_banded。
    猜你喜欢
    • 2018-06-19
    • 1970-01-01
    • 1970-01-01
    • 2012-08-01
    • 2011-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多