2011-11-29 10 views
10

में सूची-सूची-सूची मैट्रिक्स को घुमाएं मैं सामान्य रूप से क्लोजर और कार्यात्मक प्रोग्रामिंग के लिए नया हूं। मैं एक कार्यात्मक तरीके से इसे संभालने के तरीके में एक नुकसान में हूँ।क्लोजर

मैं निम्नलिखित मैट्रिक्स है:

(def matrix [[\a \b \c] 
      [\d \e \f] 
      [\g \h \i]]) 

मैं यह कुछ इस तरह के रूप में बदल करना चाहते हैं (वामावर्त बारी बारी से):

((\a \d \g) 
(\b \e \h) 
(\c \f \i)) 

मैं इस बिट है कि मुझे तत्वों देता काट दिया गया है सही क्रम में। अगर मैं स्ट्रिंग में डेटा एकत्र कर सकता हूं तो मैं इसे विभाजन के साथ विभाजित कर सकता हूं। हालांकि मैं बहुत यकीन है कि doseq गलत रास्ता है कर रहा हूँ:

(doseq [i [0 1 2]] 
    (doseq [row matrix] 
    (println (get (vec row) i)))) 

मैं नेस्टेड नक्शा कॉल के साथ dabbled है लेकिन उस के साथ अटक रहते हैं। क्लोजर में स्ट्रिंग बनाने या इसे बेहतर तरीके से संभालने का सही तरीका क्या है?

उत्तर

30

क्या आप transpose जैसी ध्वनि प्राप्त करने की कोशिश कर रहे हैं। मैं सुझाव दूंगा कि

(apply map list matrix) 
; => ((\a \d \g) (\b \e \h) (\c \f \i)) 

यह क्या करता है?

(apply map list '((\a \b \c) (\d \e \f) (\g \h \i))) 

(map list '(\a \b \c) '(\d \e \f) '(\g \h \i)) 

जो तीन सूचियों में से प्रत्येक के पहले तत्व लेता है के बराबर है, उन पर सूची कहता है, तो दूसरी तत्वों लेता है, उन पर सूची कॉल ... एक के एक दृश्य देता है सभी सूचियों को इस तरह से उत्पन्न किया गया था।

क्लोजर डॉक्स पर apply और map दोनों के कुछ और उदाहरण मिल सकते हैं।

(def transposed-matrix (apply map list matrix)) 
;=> ((\a \d \g) (\b \e \h) (\c \f \i)) 

(doseq [row transposed-matrix] 
    (doall (map println row))) 

कि अपने मूल रूप में एक ही उत्पादन का उत्पादन (matrix के कॉलम मुद्रण):

+0

प्रभावशाली ओर इशारा करते हुए के लिए भयानक THX लग रहा है! धन्यवाद – JustGage

9

rosettacode से सीधे matrix transposition समाधान ले रहा है:

(vec (apply map vector matrix))

देखने के लिए क्या करने पर विचार चल रहा है:

(map vector [\a \b \c] [\d \e \f] [\g \h \i])

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

+0

rosettacode वहाँ – jm0

5

आप इस तरह के मैट्रिक्स मैनिपुलेशन को आसानी से करने के लिए core.matrix का उपयोग कर सकते हैं। विशेष रूप से, वहाँ पहले से ही एक transpose समारोह है कि वास्तव में करता है कि आप क्या चाहते:

उदाहरण:

(use 'clojure.core.matrix) 

(def matrix [[\a \b \c] 
      [\d \e \f] 
      [\g \h \i]]) 

(transpose matrix) 
=> [[\a \d \g] 
    [\b \e \h] 
    [\c \f \i]]