【问题标题】:Matrix transposition in clojureClojure中的矩阵转置
【发布时间】:2012-05-08 00:08:34
【问题描述】:

在 clojure 中,矩阵的可能表示是向量的向量,即[[1 2] [3 4]]。 转置矩阵的可能实现是:

(defn transpose [matrix]
  (loop [matrix matrix, transp [], i 0]
    (if (< i (count (nth matrix 0)))
      (recur matrix 
             (conj transp
                   (vec (reduce concat
                                (map #(conj [] (nth %1 i))
                                     matrix))))
             (inc i))
      transp)))

谁能想到更惯用的 clojure 实现?例如避免这种可怕的循环再次发生?

【问题讨论】:

标签: clojure matrix


【解决方案1】:

截至 2014 年,我建议在 Clojure 中使用 core.matrix 进行任何数值工作。

除其他外,它提供了所有最常见的矩阵运算的实现:

(use 'clojure.core.matrix)

(transpose [[1 2] [3 4]])
=> [[1 3] [2 4]]

【讨论】:

  • 如果你要推荐的话,我认为你至少应该提到 core.matrix 是你写的。
  • 鉴于他推荐的命名空间前面带有“clojure.core”字样这一更相关的事实,我不认为他是作者
  • 这是一个有效的答案。我看不出免责声明如何改进它。 ... 可以说,这可能不是惯用的 clojure,但优化的库对于矩阵操作来说是惯用的。
  • 您也可以尝试Neanderthal - 用于clojure 的新的本机速度矩阵库。
【解决方案2】:

通常的解决办法是

(defn transpose [m]
  (apply mapv vector m))

【讨论】:

  • 这是有效的,因为(apply mapv vector m)(mapv vector (m 0) (m 1) ...) 相同。 map/mapv 在这种情况下接受函数 (vector) 和任意数量的集合。如果提供了多个集合,则map 会将函数 (vector) 应用于这些集合中的第一个项目,然后应用于第二个项目,等等。
猜你喜欢
  • 1970-01-01
  • 2010-12-13
  • 2010-11-13
  • 2011-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多