在clojure中的矩阵转置

时间:2012-04-27 08:29:02

标签: clojure matrix

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

2 个答案:

答案 0 :(得分:59)

通常的解决方案是

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

答案 1 :(得分:19)

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

除此之外,这还提供了所有最常见的矩阵运算的实现:

(use 'clojure.core.matrix)

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