Clojure中矩阵的良好表示是什么?我对处理浮点数密集矩阵很感兴趣。我想到了“列表清单”的表现形式,但还有更好的东西吗?
良好代表性的一些标准包括:
map
替换为pmap
即可使用所有核心,那就太好了。reduce
的使用:似乎很多我正在使用reduce
进行的计算很好。有什么想法吗?
答案 0 :(得分:10)
Incanter提供了一些Parallel Colt的包装器,包括与Clojure基于seq的库接口的快速,并行化密集矩阵的相当不错的实现。我没有使用它,但它应该是你正在寻找的。
答案 1 :(得分:5)
我正在编写一个包裹jblas的矩阵库,暂时称为Clatrix。它缺少我仍想添加的许多功能,但它可能是您可能正在寻找的大部分内容。看看http://github.com/tel/clatrix。
答案 2 :(得分:4)
答案 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程序员,我简要地认为你可以将矩阵实现为一维结构(即直线序列或更好的矢量),并进行自己的索引计算以找到正确的元素。你可以使用分区功能来逐步完成它...好吧,这可以使用,但我怀疑有很好的理由不这样做。