各种clojure矩阵库之间存在哪些性能折衷?

时间:2014-01-20 02:14:09

标签: performance matrix clojure jvm

有许多矩阵库用于clojure:

这些图书馆之间的性能平衡是什么? 我听说有一些底层实现,在(例如)矩阵实例化和操作性能之间存在权衡,但我无法找到详细说明这些注意事项的综合资源。

由于

1 个答案:

答案 0 :(得分:6)

如果你想使用core.matrix,目前只有两种实现相当成熟和高效的实现:

  • Clatrix - 使用对原生BLAS
  • 的调用
  • vectorz-clj - 灵活而快速的纯JVM 实施

这真的取决于你的用例。如果你最关心大线性代数运算并且不介意原生依赖,那么Clatrix是你目前最好的选择 - 仅仅因为BLAS实现如此之快。这对于:

特别有用
  • 大矩阵乘法
  • 线性代数(矩阵分解等)

如果你想做一般的数组编程工作,那么vectorz-clj具有纯JVM代码的优势,并且在数组/矩阵格式方面更加灵活。 vectorz-clj很好地支持你在Clatrix中无法做到的事情的例子:

  • N维数组
  • 各种特殊类型的稀疏数组(对角矩阵,不同的稀疏存储格式等)
  • 具有任意跨步访问权限的阵列(如Numpy)
  • 轻量级“视图”到更大的数组

总的来说,vectorz-clj对于大矩阵乘法这样的事情来说不会那么快,但对于许多其他操作和中小型矢量工作来说,Clatrix可能比vectorz-clj快。我通常会选择core.matrix,除非我认为线性代数性能会成为主要瓶颈。

其他core.matrix实现不太成熟,但可能仍然对特定用例有用。 core.matrix的一个很好的功能是能够在使用相同的通用API时混合和匹配实现,因此它不是“全有或全无”的选择。

免责声明:我已经创建或参与了上述许多项目。我希望我给出了一个相当公正和客观的评价。

如果您不需要core.matrix支持,那么您还有更多选择 - 您可以通过Clojure的Java互操作使用任何Java矩阵库。理论上,这些也可能成为{{1}}实现 - 唯一的限制是有人需要做扩展core.matrix协议的工作以支持新的矩阵类型。