28

在 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 实现?例如,为了避免这种可怕的循环再次发生?

4

2 回答 2

74

通常的解决方案是

(defn transpose [m]
  (apply mapv vector m))
于 2012-04-27T08:35:20.813 回答
22

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

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

(use 'clojure.core.matrix)

(transpose [[1 2] [3 4]])
=> [[1 3] [2 4]]
于 2014-02-20T02:13:12.973 回答