Clojure中的基质转座

matrix transposition in clojure

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

1
2
3
4
5
6
7
8
9
10
(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实现吗?例如避免这种可怕的循环再次发生?


通常的解决方法是

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


从2014年开始,我建议使用core.matrix进行Clojure中的任何数值运算。

其中,这提供了所有最常见的矩阵运算的实现:

1
2
3
4
(use 'clojure.core.matrix)

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