2012-04-27 45 views
18

在clojure中,矩陣的可能表示是向量的向量,即[[1 2] [3 4]]。 一種可能實現轉置矩陣是:clojure中的矩陣轉置

(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

你知道咒術?如果你需要各種矩陣操作,它可能是一個靈感來源 - https://github.com/liebke/incanter/wiki/matrices – sw1nn 2012-04-27 11:26:08

回答

55

通常的解決辦法是

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

截至2014年,我會建議使用core.matrix在Clojure的任何數值的工作。

除其他事項外,這提供了所有最常見的矩陣運算的實現:

(use 'clojure.core.matrix) 

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

我認爲你至少應該提到core.matrix是由你寫的,如果你是去推薦它。 – amalloy 2014-07-28 06:47:25

+9

我會打折,他是作者給出的更有針對性的事實,他推薦的命名空間前面加了詞「clojure.core」 – ctpenrose 2015-12-18 07:30:57

+1

這是一個有效的答案。我不明白如何免責聲明可以改善它。 ......可以說,這可能不是慣用的clojure,但優化的庫是矩陣操作的慣用語。 – muhuk 2016-03-19 18:37:57