【发布时间】: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