【问题标题】:Fast linear system solver for D? [closed]D 的快速线性系统求解器? [关闭]
【发布时间】:2011-02-08 19:56:42
【问题描述】:

我在哪里可以获得用 D 编写的快速线性系统求解器?它应该能够取一个方阵 A 和一个向量 b 并求解方程 Ax = bb,理想情况下,还对 A 执行显式反转。我有一个我自己写的,但它很慢,可能是因为它完全是缓存幼稚的。但是,对于我的用例,我需要具有以下 绝对、不可协商 要求的东西,即如果它不满足这些要求,那么我不在乎否则有多好:

  1. 必须获得公共领域许可、Boost 许可或一些类似的许可许可。理想情况下,它不应该要求在二进制文件中进行归属(即不是 BSD),尽管这一点是可以协商的。

  2. 必须用纯 D 编写或易于翻译成纯 D。难以理解的 Fortran 代码(即 LAPACK)无论多快都不是一个好的答案。

  3. 必须针对大型(即 n > 1000)系统进行优化。我不希望为游戏程序员设计的东西真的非常快地解决 4x4 矩阵。

  4. 不得与我不需要的庞大资料库密不可分。

编辑:这些看似疯狂的要求的原因是,我需要此代码用于获得许可的开源库,我不想拥有任何第三方依赖项。

【问题讨论】:

  • A 有什么属性?对称?积极的?肯定的?带状?疏?您要求快速的公共领域并排除 LAPACK!听起来您实际上并不想要解决方案!您是否知道所有高性能线性求解器都源自 The Handbook?
  • @Baxissimo “自动计算手册:线性代数”最初于 1972 年出版,由 J. H. Wilkinson 和 C. Reinsch 撰写

标签: performance libraries d linear-algebra


【解决方案1】:

如果您不喜欢 Fortran 代码,Eigen 是一个相当快速的 C++ 密集矩阵库,它具有适度的多核支持、编写良好的代码和良好的用户界面。将其代码转换为 D(或从中获取一些算法)应该很简单。

现在我的“考虑您的要求”:“每个人”(Mathematica、Matlab、Maple、SciPy、GSL、R、...)使用 ATLAS / LAPACK、UMFPACK、PARDISO、CHOLMOD 等是有原因的。编写快速、多线程、内存效率高、可移植且数值稳定的矩阵求解器是一项艰巨的工作(相信我,我已经尝试过)。很多这些艰苦的工作已经进入了 ATLAS 和其他领域。

所以我的方法是根据您的矩阵类型为相关库编写绑定,并从 D 链接到 C 接口。也许multiarray 中的绑定就足够了(我没试过)。否则,我建议查看另一个 C++ 库,即 uBlas 和各自的 bindings 以获得想法。

【讨论】:

  • LAPACK 等的问题是我需要它用于一小段代码并且不想要依赖项。另外,我不能使用 Eigen,因为它是 LGPL,所以我的 D 翻译将被 copyleft 覆盖。
  • @dsimcha:有道理。也许查看 Eigen 的部分枢轴 LU 和三角化源可能会有所帮助。我怀疑这些算法是否被 LGPL 涵盖(考虑到它们很可能基于以前的学术研究),但我不是律师。至于 LAPACK 依赖关系:它可能没有看起来那么大。 LAPACK 预装在 OS X 上,在 Unix / Linux 上预装或一个 apt-get away,Windows 二进制文件随时可用。但我不想鞭打一匹死马……
  • 我所知道的是,上次我出于不相关的原因尝试让 LAPACK 在 Windows 上工作时从未成功过。 (我不记得细节了。)也许如果我知道怎么做,我会保留我的慢纯 D 例程作为默认值,并添加一个 -version=LAPACK 标志,所以如果你安装了 LAPACK 并且需要速度,你可以得到它。 (这个求解器的性能只在 N 很大的相对不寻常的情况下才重要。对于小的 N,朴素算法就足够快了。)
  • 算法可能是公共领域,但实现可以是版权。
  • @dsimcha 编译一些 LAPACK 例程真的不难,从来没有太多的依赖关系。你会疯了去尝试其他任何东西。我得到了 Fortran,通过 f2c -a 推送它,然后编译 C。Bob 是你的叔叔!
猜你喜欢
  • 2020-10-24
  • 2017-12-13
  • 1970-01-01
  • 2013-03-18
  • 1970-01-01
  • 1970-01-01
  • 2014-05-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多