Clojure矩阵表示

时间:2009-11-04 14:59:12

标签: math clojure matrix linear-algebra

Clojure中矩阵的良好表示是什么?我对处理浮点数密集矩阵很感兴趣。我想到了“列表清单”的表现形式,但还有更好的东西吗?

良好代表性的一些标准包括:

  • 效率:它们不会用于大量数据集的持续处理,但我不想花费数小时来计算可以在几分钟内完成设计的结果。
  • Java互操作性:很容易在两种语言之间来回传递数据。
  • 轻松并行化:如果我只需将map替换为pmap即可使用所有核心,那就太好了。
  • 适合reduce的使用:似乎很多我正在使用reduce进行的计算很好。
  • 表示矩阵行中的图像扫描线的能力:不是很重要,但很高兴。

有什么想法吗?

7 个答案:

答案 0 :(得分:10)

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

Example

答案 1 :(得分:5)

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

答案 2 :(得分:4)

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

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

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

答案 3 :(得分:2)

我目前正在使用cryptovide中的列表列表方法,因为它对于保持懒惰的应用程序非常重要。我也在考虑转向更有效的方法,只要它至少保持外向表示懒惰。

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

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

答案 6 :(得分:-1)

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

list-of-lists可能是代表矩阵的最自然的Clojure成语。这种结构也非常适合映射/减少各种操作。 Clojure在处理序列方面也非常有效 - 可能比大多数替代品更好。

我不能发誓这一点,但我想我已经看到Clojure工作3或者我的所有4个CPU很难用于我编写的程序功能,但没有尝试并行。我怀疑编译器正在寻找一些自己进行并行处理的机会。

我认为Clojure创建的序列类型将作为Java中的列表使用,或者至少是Iterable。这可能足以满足您的需求,但如果您尝试将这些结构视为可修改的Java,则可能会遇到问题。

列表最好按顺序访问。如果你计划在矩阵中大量跳转,矢量矢量可能会更好地适应你,性能更好。我怀疑使用 nth 函数进行节拍。

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