2016-01-31 12 views
6

क्या जूलिया में टुकड़े की तरह/गैर-संगत श्रेणियों के लिए कोई ऑब्जेक्ट क्लास है? उदाहरण के लिए, मैं एक नियमित सीमा बना सकते हैं:टुकड़ा/गैरकानूनी रेंज?

a = UnitRange(1:5) 

लेकिन, अगर मैं अन्य सीमाओं के साथ इस गठबंधन करने के लिए चाहता था:

b = UnitRange([1:5, 8:10, 4:7]) 

मैं वर्तमान में एक वस्तु या विधि नहीं मिल सकता है। एक PiecewiseIncreasingRanges मॉड्यूल (https://github.com/simonster/PiecewiseIncreasingRanges.jl) है जो मैं इस स्थिति में वही चाहता हूं, सिवाय इसके कि, जैसा कि नाम का तात्पर्य है, श्रेणियों को एकान्त रूप से बढ़ने की आवश्यकता है।

इसके लिए संदर्भ यह है कि मैं दोहराने वाली पंक्तियों के साथ स्पैर मैट्रिक्स के लिए स्पैसमैटिक्ससीएससी प्रकार का संकुचित, स्मृति कुशल संस्करण बनाने का एक तरीका ढूंढ रहा हूं। RLEVectors मॉड्यूल स्पैर मैट्रिक्स क्लास में nonzerovalue वेक्टर पर स्थान बचाने के लिए अच्छी तरह से काम करेगा। हालांकि मैं पंक्तिवृत्त वेक्टर के लिए जगह बचाने के लिए कुछ खोजने की कोशिश कर रहा हूं जो स्पैर मैट्रिक्स को भी परिभाषित करता है, क्योंकि दोहराने वाली पंक्तियों की श्रृंखला के परिणामस्वरूप उस वेक्टर में मूल्यों की सीमा होती है (उदाहरण के लिए यदि पहली 10 पंक्तियां, या यहां तक ​​कि कुछ कॉलम भी एक स्पैर मैट्रिक्स की पहली दस पंक्तियां समान हैं, फिर पंक्ति मूल्य वेक्टर में बहुत से 1:10 पैटर्न होंगे)।

for (idx, item) in enumerate(hypothetical_object) 
    println("idx: $idx, item: $item") 
end 

idx: 1, item: 1 
idx: 2, item: 2 
... 
idx: 5, item: 5 
idx: 6, item: 8 
idx: 7, item: 9 
idx: 8, item: 10 
idx: 9, item: 4 
idx: 10, item: 5 
... 

अपडेट:: एक बात मैं पर विचार कर रहा हूँ

आम तौर पर, मैं इस तरह के ख उद्देश्य यह है कि मैं ऊपर बनाने का प्रयास करें जिस पर मैं एक दोहराया पाश कर सकता है, हो रही है के रूप में एक सीमा के लिए करना चाहते हैं , और अगर मैं यहां अन्य सुझाव नहीं सुनता तो शायद कार्यान्वित करने का प्रयास करूंगा, केवल मेरे स्पेस मैट्रिक्स में प्रत्येक कॉलम के लिए, PiecewiseIncreasingRange ऑब्जेक्ट्स की एक सरणी बनाना होगा। (मैं शायद अलग-अलग टुकड़ों की एक सरणी में nonzero वैल्यू वेक्टर तोड़ दूंगा, एक मेरे स्पैर मैट्रिक्स के प्रत्येक कॉलम के लिए भी)। यह कम से कम लागू करने के लिए अपेक्षाकृत सरल होगा। मुझे बल्ले से अच्छी समझ नहीं है कि इस तरह की वस्तु के लिए कम्प्यूटेशनल दक्षता के मामले में यह तुलना किस प्रकार की जा रही है। मुझे संदेह है कि स्मृति आवश्यकताओं के बारे में वही होगा।

+1

एक अच्छा नया 'टाइप' जैसा लगता है जिसे जूलिया में जोड़ा जा सकता है। संभावित नाम: 'संपीड़ितसेट', 'रेंजसेट'। शायद अन्य टिप्पणीकारों के बेहतर नाम होंगे। –

+0

बस अपने शुरुआती प्रश्न के लिए, क्या आप श्रेणियों की एक सरणी का उपयोग नहीं कर सकते? – rcpinto

+0

@rcpinto मैं निश्चित नहीं हूँ। बात यह है कि मैं इस ऑब्जेक्ट को लुकअप विधि के माध्यम से सामान्य श्रेणी की तरह पूछने में सक्षम होना चाहता हूं। जैसे एक नियमित सीमा के साथ, मैं, उदाहरण के लिए, (20:40) [5] दर्ज कर सकता हूं और 24 वापस प्राप्त कर सकता हूं, जो मैं चाहता हूं, और कार्यक्षमता जो मैं ऊपर लूप चित्रण में वर्णन करने की कोशिश कर रहा था। हालांकि श्रृंखलाओं की एक श्रृंखला के साथ, मैं कम से कम इसे प्राप्त करने के लिए एक स्पष्ट तरीका नहीं देख सका। उदाहरण के लिए, सरणी पर लुकअप का उपयोग करना, मुझे केवल एक विशेष रेंज देगा। एक संभावना है कि इस तरह के एक सरणी के लिए एक नई विधि को परिभाषित करना होगा। लेकिन क्या आप एक और सीधा तरीका देखते हैं? –

उत्तर

2

श्रेणियों (या अन्य पुनरावृत्तियों) के अनुक्रम पर लूप करने के लिए, आप Iterators.jl पैकेज में chain फ़ंक्शन का उपयोग कर सकते हैं।

उदाहरण के लिए: using Iterators b = chain(1:5, 8:10, 4:7) for i in b println(i) end प्रत्येक श्रेणी के तत्वों को आउटपुट करता है।