Math Clojure矩阵表示
Clojure中矩阵的良好表示是什么?我对处理浮点数的密集矩阵感兴趣。我想到了“列表列表”表示法,但还有更好的吗 良好代表性的一些标准包括:Math Clojure矩阵表示,math,clojure,matrix,linear-algebra,Math,Clojure,Matrix,Linear Algebra,Clojure中矩阵的良好表示是什么?我对处理浮点数的密集矩阵感兴趣。我想到了“列表列表”表示法,但还有更好的吗 良好代表性的一些标准包括: 效率:它们不会用于不断处理庞大的数据集,但我不想花费数小时计算结果,如果设计得更好,这些结果本可以在几分钟内完成 Java互操作性:很容易在两种语言之间来回传递数据 简单的并行化:如果我可以使用所有可用的内核,只需将map替换为pmap,那就太好了 易于使用reduce:似乎我在reduce上做的很多计算都很好 在矩阵行中表示图像扫描线的能力:不是很重要
- 效率:它们不会用于不断处理庞大的数据集,但我不想花费数小时计算结果,如果设计得更好,这些结果本可以在几分钟内完成
- Java互操作性:很容易在两种语言之间来回传递数据
- 简单的并行化:如果我可以使用所有可用的内核,只需将
替换为map
,那就太好了pmap
- 易于使用
:似乎我在reduce
上做的很多计算都很好reduce
- 在矩阵行中表示图像扫描线的能力:不是很重要,但最好有
有什么想法吗?我不是专家,但我的意见是:) 列表列表可能是Clojure最自然的表示矩阵的习惯用法。这种结构还可以很好地映射/减少各种操作。Clojure在处理序列方面也非常有效——可能比大多数替代品都好 我不能保证这一点,但我想我见过Clojure在我编写的程序上努力工作3个或全部4个CPU,这些程序都是功能性的,但没有尝试并行。我怀疑编译器正在自己寻找一些并行处理的机会 我认为Clojure创建的序列类型在Java中可以作为列表使用,或者至少是可移植的。这可能已经足够满足您的需要了,尽管如果您试图在Java中将这些结构视为可修改的,可能会遇到问题 最好按顺序访问列表。如果您计划在矩阵中进行大量转换,那么从性能角度来看,向量向量可能更适合您。我怀疑使用nth功能的节拍 作为一名前C程序员,我简单地考虑过,您可以将矩阵实现为一维结构(即,直序列或更好的向量),并进行自己的索引计算以找到正确的元素。您可以使用分区函数逐步完成它。。。好吧,这是可以实现的,但我怀疑有很好的理由不这样做。提供了一些包装,包括看起来相当不错的快速并行密集矩阵实现,它与Clojure基于seq的库接口。我没用过,但应该是你要找的
.我目前正在使用中的列表方法,因为对于这个应用程序来说,让事情变得懒惰非常重要。我也在考虑转换到一种更有效的方法,只要它至少保持了外部表现的惰性 Rich Hickey的Clojure是一个基于JVM的Lisp,它用32路树表示PersistentVector(而不是PersistentList) 如果您想编写自己的矩阵类型,我将使用PersistentVector
否则最好的选择是使用平行柯尔特和白炽灯。我正在编写一个矩阵库包装,暂定名为Clatrix。它缺少了很多我仍然想添加的功能,但它包含了您可能需要的大部分功能。看一看,.我最近写了一些需要矩阵数学的代码,最初我使用了向量向量,map&reduce,但当我回到它时,发现结果代码很难理解(我对Clojure来说是个新手)。白炽灯使相同的代码非常简洁、易于理解(标准矩阵运算),而且速度更快。请查看core.matrix提案+此处的实验实施:
写这篇文章的时候还很早,但值得关注。答案可能需要在8年后更新。谷歌快速搜索显示,如果需要与Clojure core.matrix API兼容,可以使用core.matrix本身或其他实现,如vectorz clj
此外,我还发现了哪些是针对GPU优化的您希望对这些矩阵执行何种操作?对于某些操作来说,将它们表示为列表列表是一个不错的选择,但如果您需要频繁访问数组的任意数组元素,它会让您丧命。截至2014年3月,我已经将其开发成一个相当全面的数组编程系统,名为
core.matrix
注意:这个答案现在已经过时了。白炽灯现在使用Clatrix,并且有新的更高级的矩阵实现avialable(请参见core.matrix
及其各种实现,例如vectorz clj
)。