7

Clojure 中矩阵的良好表示是什么?我对处理浮点数的密集矩阵感兴趣。“列表列表”表示浮现在脑海中,但有更好的吗?

良好表现的一些标准包括:

  • 效率:它们不会用于持续处理庞大的数据集,但我不想花费数小时计算通过更好的设计可以在几分钟内完成的结果。
  • Java 互操作性:在两种语言之间轻松地来回传递数据会很好。
  • 轻松并行化:如果我可以简单地通过替换来使用所有可用的内核mappmap那就太好了。
  • 适合使用reduce: 看起来我正在做的很多计算都很好用reduce
  • 在矩阵行中表示图像扫描线的能力:不是很重要,但如果有就好了。

有什么想法吗?

4

8 回答 8

10

Incanter提供了一些Parallel Colt的包装器,包括看起来相当不错的快速并行密集矩阵的实现,它与 Clojure 的基于 seq 的库接口。我没有使用它,但它应该是你正在寻找的。

例子

于 2009-11-04T17:03:35.063 回答
5

我正在编写一个包装jblas的矩阵库,暂时称为 Clatrix。它缺少很多我仍想添加的功能,但它拥有您可能正在寻找的大部分功能。看看, http: //github.com/tel/clatrix

于 2012-04-30T22:47:05.790 回答
4

在此处查看 core.matrix 提案 + 实验性实现:

https://github.com/mikera/matrix-api

在撰写本文时非常早期,但值得关注。

于 2013-01-24T21:55:48.397 回答
2

我目前在cryptovide中使用列表方法,因为它对于这个应用程序保持惰性非常重要。我也在考虑改用一种更有效的方法,只要它至少保持外部表示惰性。

于 2009-11-04T17:45:09.913 回答
0

Rich Hickey 的 Clojure 是一个基于 JVM 的 Lisp,它用 32 路树表示 PersistentVector(不是 PersistentList)。

如果您想编写自己的矩阵类型,我会使用 PersistentVector,否则最好的选择是使用 Parallel Colt 和 Incanter。

于 2010-02-23T13:30:09.883 回答
0

我最近编写了一些需要矩阵数学的代码,最初我使用了向量的向量、map 和 reduce,但是当我返回它时发现生成的代码很难理解(我是 Clojure 的新手)。Incanter 使相同的代码非常简洁、易于理解(标准矩阵运算)并且速度更快。

于 2012-05-01T00:21:05.840 回答
0

随着 8 年过去了,答案可能需要更新。谷歌快速搜索显示,如果需要兼容 Clojure core.matrix API,可以使用 core.matrix 本身或其他实现,例如 vectorz-clj。

此外,我发现了针对 GPU 优化的尼安德特人

于 2017-08-11T04:17:29.497 回答
-1

我不是专家,但无论如何这是我的意见:)

list-of-lists 可能是表示矩阵的最自然的 Clojure 习惯用法。这种结构也很适合 map/reduce 类型的操作。Clojure 在处理序列方面也非常有效 - 可能比大多数替代方案更好。

我不能对此发誓,但我认为我已经看到 Clojure 在我编写的程序上努力工作 3 或全部 4 个 CPU,这些程序在风格上是功能性的,但没有尝试并行。我怀疑编译器正在自己寻找一些并行处理的机会。

我认为 Clojure 创建的序列类型将在 Java 中作为列表工作,或者至少是可迭代的。这对于您想要的可能已经足够了,尽管如果您尝试将这些结构视为 Java 中的可修改结构,您可能会遇到问题。

列表最好按顺序访问。如果您打算在矩阵中跳来跳去,那么从性能角度来看,向量的向量可能更适合您。我怀疑使用第n 个函数会节拍。

作为一名前 C 程序员,我简要地考虑过您可以将矩阵实现为一维结构(即直序列或更好的向量),并进行自己的索引计算以找到正确的元素。您可以使用分区函数来逐步完成它......好吧,这可以工作,但我怀疑有很好的理由不这样做。

于 2009-11-04T16:22:19.397 回答