एक बार जब मैंने हास्केल सरणी लाइब्रेरी की सुविधाओं की समीक्षा की जो मेरे लिए मायने रखती है, और एक तुलना तालिका (केवल स्प्रेडशीट: प्रत्यक्ष लिंक ) संकलित की है । तो मैं जवाब देने की कोशिश करूंगा।
वेक्टर के बीच मुझे किस आधार पर चुनना चाहिए। Unboxed और UArray? वे दोनों अनबॉक्स्ड एरेज़ हैं, लेकिन वेक्टर एब्स्ट्रक्शन भारी रूप से विज्ञापित लगता है, विशेष रूप से लूप फ़्यूज़न के आसपास। क्या वेक्टर हमेशा बेहतर होता है? यदि नहीं, तो मुझे किस प्रतिनिधित्व का उपयोग करना चाहिए?
यदि वेक्टर को दो-आयामी या बहुआयामी सरणियों की आवश्यकता हो तो UArray को वेक्टर के ऊपर पसंद किया जा सकता है। लेकिन वेक्टर में हेरफेर के लिए अच्छे एपीआई हैं, अच्छी तरह से वैक्टर। सामान्य तौर पर, वेक्टर बहु-आयामी सरणियों के अनुकरण के लिए अच्छी तरह से अनुकूल नहीं है।
Vector.Unboxed का उपयोग समानांतर रणनीतियों के साथ नहीं किया जा सकता है। मुझे संदेह है कि UArray का उपयोग न तो किया जा सकता है, लेकिन कम से कम UArray से बॉक्सिंग ऐरे में स्विच करना बहुत आसान है और देखें कि क्या समानांतरकरण से बॉक्सिंग लागत का लाभ मिलता है।
रंग छवियों के लिए मैं 16-बिट पूर्णांक या एकल-सटीक फ़्लोटिंग-पॉइंट संख्याओं के त्रिगुणों को संग्रहीत करना चाहूंगा। इस प्रयोजन के लिए, या तो वेक्टर या UArray का उपयोग करना आसान है? अधिक प्रदर्शन करने वाला?
मैंने छवियों का प्रतिनिधित्व करने के लिए Arrays का उपयोग करने की कोशिश की (हालांकि मुझे केवल ग्रेस्केल छवियों की आवश्यकता थी)। रंगीन चित्रों के लिए मैंने कोडेक्स-इमेज-डेविल लाइब्रेरी का उपयोग किया (इमेज (बाइंडिंग टू डेविल लाइब्रेरी) लिखने के लिए, ग्रेस्केल इमेज के लिए मैंने पीजीएम लाइब्रेरी (शुद्ध हास्केल) का उपयोग किया।
सरणी के साथ मेरी प्रमुख समस्या यह थी कि यह केवल यादृच्छिक अभिगम भंडारण प्रदान करता है, लेकिन यह सरणी एल्गोरिदम के निर्माण के कई साधन प्रदान नहीं करता है और न ही सरणी दिनचर्या के पुस्तकालयों का उपयोग करने के लिए तैयार नहीं है (रैखिक बीजगणित के साथ इंटरफेस नहीं करता है, doesn 'विश्वास व्यक्त करने की अनुमति नहीं है, fft और अन्य परिवर्तन)।
लगभग हर बार एक नए एरे को मौजूदा एक से बनाया जाना चाहिए, मूल्यों की एक मध्यवर्ती सूची का निर्माण करना होगा (जैसे कि मैट्रिक्स परिचय से मैट्रिक्स गुणन )। सरणी निर्माण की लागत अक्सर तेजी से यादृच्छिक पहुंच के लाभों को इंगित करती है, इस बात के लिए कि मेरे उपयोग के कुछ मामलों में सूची-आधारित प्रतिनिधित्व तेज है।
STUArray मेरी मदद कर सकता था, लेकिन मुझे STUArray के साथ बहुरूपी कोड लिखने के लिए आवश्यक गूढ़ प्रकार की त्रुटियों और प्रयासों से लड़ना पसंद नहीं था ।
इसलिए एरे के साथ समस्या यह है कि वे संख्यात्मक अभिकलन के लिए अच्छी तरह से अनुकूल नहीं हैं। हैमेट्रिक्स 'Data.Packed.Vector और Data.Packed.Matrix इस संबंध में बेहतर हैं, क्योंकि वे एक ठोस मैट्रिक्स लाइब्रेरी (ध्यान: GPL लाइसेंस) के साथ आते हैं। मैट्रिक्स गुणा पर प्रदर्शन-वार, हेट्रिक्स पर्याप्त रूप से तेज़ था ( केवल ऑक्टेव की तुलना में थोड़ा धीमा ), लेकिन बहुत मेमोरी-भूख (पायथन / SciPy की तुलना में कई गुना अधिक खपत)।
मेट्रिसेस के लिए ब्लास लाइब्रेरी भी है, लेकिन यह जीएचसी 7 पर नहीं बनती है।
मेरे पास अभी तक रेपा के साथ बहुत अनुभव नहीं था, और मैं रेपा कोड को अच्छी तरह से नहीं समझता। जो कुछ मैं देख रहा हूं, उसमें मैट्रिक्स और ऐरे एल्गोरिदम का उपयोग करने के लिए बहुत सीमित रेंज है जो इसके ऊपर लिखा है, लेकिन लाइब्रेरी के माध्यम से कम से कम महत्वपूर्ण एल्गोरिदम को व्यक्त करना संभव है। उदाहरण के लिए, पहले से ही मैट्रिक्स गुणन के लिए और रेपा-एल्गोरिदम में कन्वेंशन के लिए रूटीन हैं । दुर्भाग्य से, ऐसा लगता है कि सजा अब 7 × 7 गुठली तक सीमित है (यह मेरे लिए पर्याप्त नहीं है, लेकिन कई उपयोगों के लिए पर्याप्त होना चाहिए)।
मैंने हास्केल ओपनसीवी बाइंडिंग की कोशिश नहीं की। उन्हें तेज होना चाहिए, क्योंकि ओपनसीवी वास्तव में तेज है, लेकिन मुझे यकीन नहीं है कि बाइंडिंग पूरी हो गई है और उपयोग करने योग्य है। इसके अलावा, OpenCV की प्रकृति बहुत विनाशकारी है, विनाशकारी अपडेट से भरी हुई है। मुझे लगता है कि इसके ऊपर एक अच्छा और कुशल कार्यात्मक इंटरफ़ेस डिजाइन करना कठिन है। यदि कोई OpenCV रास्ता जाता है, तो वह हर जगह OpenCV छवि प्रतिनिधित्व का उपयोग करने की संभावना है, और उन्हें हेरफेर करने के लिए OpenCV दिनचर्या का उपयोग करें।
बिटोनल छवियों के लिए मुझे प्रति पिक्सेल केवल 1 बिट स्टोर करने की आवश्यकता होगी। क्या कोई पूर्वनिर्धारित डेटाटाइप है जो एक शब्द में कई पिक्सेल पैक करके मेरी मदद कर सकता है, या मैं अपने दम पर हूँ?
जहां तक मुझे पता है, बूलों के अनबॉक्स्ड एरेज बिट वैक्टर पैकिंग और अनपैकिंग का ख्याल रखते हैं। मुझे याद है कि अन्य पुस्तकालयों में बूलों के सरणियों के कार्यान्वयन को देखते हुए, और यह कहीं और नहीं देखा।
अंत में, मेरे सरणियाँ दो-आयामी हैं। मुझे लगता है कि मैं एक प्रतिनिधित्व "सरणी के सरणी" (या वैक्टर के वेक्टर) के रूप में एक अतिरिक्त द्वारा लगाए गए अतिरिक्त अप्रत्यक्षता से निपट सकता हूं, लेकिन मैं एक अमूर्त पसंद करूंगा जिसमें सूचकांक-मैपिंग समर्थन है। क्या कोई मानक पुस्तकालय से या हैकेज से कुछ भी सुझा सकता है?
वेक्टर (और सरल सूचियों) के अलावा, अन्य सभी सरणी लाइब्रेरी द्वि-आयामी सरणियों या मैट्रिसेस का प्रतिनिधित्व करने में सक्षम हैं। मुझे लगता है कि वे अप्रत्यक्ष रूप से अप्रत्यक्ष रूप से बचते हैं।