2012-04-27 25 views
18

W clojure możliwe przedstawienie macierzy jest wektorem wektorów, tj. [[1 2] [3 4]]. Ewentualna realizacja transpozycję macierzy byłoby:transpozycja macierzy w 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))) 

ktoś może myśleć o bardziej idiomatycznych do realizacji Clojure? na przykład, aby uniknąć powtórki tej straszliwej pętli?

+2

Wiesz o incanter? Jeśli potrzebujesz różnych operacji macierzowych, może to być źródłem inspiracji - https://github.com/liebke/incanter/wiki/matrices – sw1nn

Odpowiedz

55

Typowym rozwiązaniem jest

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

Począwszy od 2014 roku, polecam korzystania core.matrix do wszelkich prac numerycznej w Clojure.

Między innymi ten zapewnia implementacje wszystkich najczęstszych operacji macierzowych:

(use 'clojure.core.matrix) 

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

Myślę, że powinieneś przynajmniej wspomnieć, że core.matrix jest napisany przez ciebie, jeśli jesteś polecam to. – amalloy

+9

Chciałbym zdyskontować fakt, że jest on autorem, biorąc pod uwagę fakt, że przestrzeń nazw, którą poleca, jest poprzedzana słowami "clojure.core". – ctpenrose

+1

To jest poprawna odpowiedź. Nie widzę, w jaki sposób zastrzeżenie może to poprawić. ... Możliwe, że nie jest to idiomatyczne clojure, ale zoptymalizowane biblioteki są idiomatyczne dla macierzy ops. – muhuk