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

met*_*ous 5 performance jvm clojure matrix

clojure有很多矩阵库:

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

谢谢

mik*_*era 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是能够在使用相同的通用API时混合和匹配实现,因此它不是"全有或全无"的选择.

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

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