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 に答える