matrix transposition in clojure
在Clojure中,矩阵的可能表示形式是向量的向量,即
转置矩阵的可能实现为:
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]] |