2012-04-27 8 views
18

In clojure ist eine mögliche Darstellung einer Matrix ein Vektor von Vektoren, d.h. [[1 2] [3 4]]. Eine mögliche Implementierung einer Matrix zur Umsetzung wäre:Matrixtransposition in 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))) 

Kann jemand denken Sie an einen mehr idiomatische zu clojure Implementierung? um zum Beispiel zu vermeiden, dass diese schreckliche Schleife wiederkehrt?

+2

Kennen Sie incanter? Wenn Sie verschiedene Matrix-Operationen benötigen, könnte es eine Quelle der Inspiration sein - https://github.com/liebke/incanter/wiki/matrices – sw1nn

Antwort

55

Die übliche Lösung ist

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

Ab 2014 Ich würde empfehlen, core.matrix für jede numerische Arbeit in Clojure verwenden.

unter anderem dies bietet Implementierungen von allen gängigsten Matrix-Operationen:

(use 'clojure.core.matrix) 

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

Ich denke, dass Sie mindestens erwähnen sollten, dass core.matrix von Ihnen geschrieben wird, wenn Sie sind werde es weiterempfehlen. – amalloy

+9

Ich würde abzählen, dass er der Autor gegeben ist die passendere Tatsache, dass der Namespace, den er empfiehlt, mit den Worten "clojure.core" vorangestellt wird – ctpenrose

+1

Dies ist eine gültige Antwort. Ich sehe nicht, wie ein Disclaimer es verbessern könnte. ... Möglicherweise handelt es sich nicht um eine idiomatische Clojure, aber optimierte Bibliotheken sind für Matrixoperationen idiomatisch. – muhuk