2012-04-27 6 views
18

क्लोजर में मैट्रिक्स का संभावित प्रतिनिधित्व वैक्टर का वेक्टर है, यानी [[1 2] [3 4]]। एक मैट्रिक्स transposing का एक संभावित कार्यान्वयन होगा:क्लोजर में मैट्रिक्स ट्रांसपोजिशन

(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

आप incanter के बारे में पता है? यदि आपको विभिन्न मैट्रिक्स ऑपरेशंस की आवश्यकता है तो यह प्रेरणा का स्रोत हो सकता है - https://github.com/liebke/incanter/wiki/matrices – sw1nn

उत्तर

55

सामान्य समाधान

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

2014 की स्थिति के अनुसार है, मैं Clojure में किसी भी काम के लिए संख्यात्मक core.matrix का उपयोग कर की सिफारिश करेंगे।

अन्य बातों के अलावा, यह सब सबसे आम मैट्रिक्स आपरेशन के कार्यान्वयन प्रदान करता है:

(use 'clojure.core.matrix) 

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

मुझे लगता है कि आपको कम से कम यह कहना चाहिए कि कोर.मैट्रिक्स आपके द्वारा लिखा गया है, अगर आप हैं इसकी सिफारिश करने जा रहा है। – amalloy

+9

मैं छूट दूंगा कि वह लेखक को अधिक प्रासंगिक तथ्य दिया गया है कि वह जिस नामस्थान की सिफारिश करता है उसे "clojure.core" – ctpenrose

+1

शब्दों के साथ प्रस्तुत किया गया है यह एक वैध उत्तर है। मैं नहीं देखता कि एक अस्वीकरण कैसे सुधार सकता है। ... तर्कसंगत रूप से, यह मूर्खतापूर्ण क्लोजर नहीं हो सकता है, लेकिन अनुकूलित लाइब्रेरी मैट्रिक्स ओप्स के लिए मूर्ख हैं। – muhuk