【问题标题】:Clojure Matrix RepresentationClojure 矩阵表示
【发布时间】:2010-12-13 01:25:16
【问题描述】:

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

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

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

有什么想法吗?

【问题讨论】:

  • 您想对这些矩阵进行什么样的操作?将它们表示为列表列表对于某些操作来说是一个不错的选择,但如果您需要频繁访问数组的任意元素,它会杀死您。

标签: math clojure matrix linear-algebra


【解决方案1】:

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

Example.

【讨论】:

  • 注意:这个答案现在已经过时了。 Incanter 现在使用 Clatrix,并且有新的更高级的矩阵实现可用(参见 core.matrix 及其各种实现,例如 vectorz-clj
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

    在撰写本文时还处于早期阶段,但值得关注。

    【讨论】:

    • 截至 2014 年 3 月,我已将其开发成一个相当全面的数组编程系统,名为 core.matrix
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

          随着 8 年过去了,答案可能需要更新。 google一搜,如果需要兼容Clojure core.matrix API,可以使用core.matrix本身或者vectorz-clj等其他实现。

          此外,我发现Neanderthal 已针对 GPU 进行了优化

          【讨论】:

            【解决方案8】:

            我不是专家,但这是我的意见:)

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

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

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

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

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

            【讨论】:

              猜你喜欢
              • 2012-05-08
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-02-12
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多