सबसे व्यापक रूप से उपयोग किए जाने वाले C ++ वेक्टर / मैट्रिक्स गणित / रैखिक बीजगणित पुस्तकालय और उनकी लागत और लाभकारी व्यापार क्या हैं? [बन्द है]


243

ऐसा लगता है कि कई परियोजनाएं धीरे-धीरे मैट्रिक्स गणित करने की आवश्यकता पर आती हैं, और पहले कुछ वेक्टर कक्षाओं के निर्माण में पड़ती हैं और धीरे-धीरे कार्यक्षमता में जुड़ती जाती हैं, जब तक कि वे आधे-मिश्रित कस्टम रैखिक बीजगणित पुस्तकालय का निर्माण नहीं कर लेती हैं, और इसके आधार पर।

मैं इस बात से बचना चाहूंगा कि कुछ मूर्त रूप से संबंधित लाइब्रेरी (जैसे ओपनसीवी, ओपनसेकेग्राफ) पर निर्भरता में निर्माण न करें।

वहां आमतौर पर उपयोग किए जाने वाले मैट्रिक्स गणित / रैखिक बीजगणित पुस्तकालय क्या हैं, और एक दूसरे पर उपयोग करने का फैसला क्यों करेंगे? क्या कोई ऐसा है जो किसी कारण से उपयोग करने के खिलाफ सलाह दी जाएगी? मैं विशेष रूप से ज्यामितीय / समय के संदर्भ में इसका उपयोग कर रहा हूं * (2,3,4 Dim) * लेकिन भविष्य में उच्च आयामी डेटा का उपयोग कर सकता है।

मैं किसी भी संबंध में अंतर की तलाश कर रहा हूं: एपीआई, गति, मेमोरी उपयोग, चौड़ाई / पूर्णता, संकीर्णता / विशिष्टता, एक्स्टेंसिबिलिटी, और / या परिपक्वता / स्थिरता।

अपडेट करें

मैंने Eigen3 का उपयोग करना समाप्त कर दिया, जिससे मैं बेहद खुश हूं।


2
जब से आपने OSG और OpenCV का उल्लेख किया है, मैं अनुमान लगा रहा हूं कि आपको बस 3D ग्राफिक्स प्रकार वेक्टर / मैट्रिसेस की आवश्यकता है, अर्थात: 3x3 और 4x4 मैट्रिस। मैंने अपना उत्तर बंद कर दिया है, लेकिन आप यह निर्दिष्ट करना चाहते हैं कि आप वास्तव में इसका उपयोग कैसे कर रहे हैं - क्या आपको मैट्रिक्स हल करने की आवश्यकता है? उच्च आयामी मैट्रिक्स गणित? आदि
रीड कोपसे

अभी मैं केवल 2D ज्यामिति आधारित सामान कर रहा हूं, लेकिन काल्पनिक रूप से आपको कभी-कभी 2D डेटा पर 3x3 संचालन की आवश्यकता होती है, और यह स्पष्ट नहीं है कि 3 डी डेटा इस प्रकार 4x4 ऑपरेशन आवश्यक हो सकता है। हम कंपनी में एक आम पुस्तकालय का उपयोग करना चाहते हैं। मेरे पास इस बात की अच्छी समझ नहीं है कि ट्रेडऑफ क्या होगा। अधिक सामान्य बेहतर होगा, लेकिन सवाल किस कीमत पर है।
Catskul

1
यदि आप सिर्फ ज्यामितीय रूपांतरण कर रहे हैं, तो मैं वास्तव में GGT को देखने की सलाह दूंगा, जैसा कि मैंने अपने उत्तर में बताया है। यह उसके लिए बहुत पूरा है, लेकिन वास्तव में कुछ भी नहीं करता है, इसलिए यह एक बहुत ही साफ, आसान विकल्प है। BLAS और LAPACK वैज्ञानिक और गणित के लिए doign जटिल मैट्रिक्स समाधान (यानी: 50x50 matrices, विरल matrices, आदि) के लिए अधिक हैं, न कि ज्यामितीय परिवर्तनों के लिए।
रीड कोपसे

जवाबों:


114

काफी कुछ प्रोजेक्ट हैं जो इसके लिए जेनेरिक ग्राफिक्स टूलकिट पर बसे हैं । वहाँ GMTL अच्छा है - यह काफी छोटा है, बहुत कार्यात्मक है, और बहुत विश्वसनीय होने के लिए व्यापक रूप से उपयोग किया जाता है। OpenSG, VRJuggler, और अन्य परियोजनाओं ने अपने स्वयं के हाथ से लुढ़का हुआ लंबर / मैट्रिक्स गणित के बजाय इसका उपयोग करने के लिए सभी स्विच किए हैं।

मैंने इसे बहुत अच्छा पाया है - यह सब कुछ टेम्पलेट्स के माध्यम से करता है, इसलिए यह बहुत लचीला है, और बहुत तेज़ है।


संपादित करें:

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

GMTL -

लाभ: सरल एपीआई, विशेष रूप से ग्राफिक्स इंजन के लिए डिज़ाइन किया गया। रेंडरिंग (जैसे विमान, AABB, कई प्रक्षेप के साथ quatenrions, आदि) की तरह कई आदिम प्रकार शामिल हैं जो किसी भी अन्य पैकेज में नहीं हैं। बहुत कम स्मृति उपरि, काफी तेज, प्रयोग करने में आसान।

डाउनसाइड्स: एपीआई विशेष रूप से रेंडरिंग और ग्राफिक्स पर केंद्रित है। सामान्य उद्देश्य (NxM) मैट्रिक्स, मैट्रिक्स अपघटन और समाधान आदि को शामिल नहीं करता है, क्योंकि ये पारंपरिक ग्राफिक्स / ज्यामिति अनुप्रयोगों के दायरे से बाहर हैं।

Eigen -

लाभ: स्वच्छ एपीआई , उपयोग करने के लिए काफी आसान है। चतुर्धातुक और ज्यामितीय परिवर्तनों के साथ एक ज्यामिति मॉड्यूल शामिल है । कम मेमोरी ओवरहेड। बड़े एनएक्सएन मैट्रिसेस और अन्य सामान्य प्रयोजन गणितीय दिनचर्या के पूर्ण, अत्यधिक प्रदर्शनकारी समाधान।

डाउनसाइड्स: आप चाहते हैं (?) की तुलना में थोड़ा बड़ा स्कोप हो सकता है। जीएमटीएल (यानी: यूलर एंगल डेफिनिशन, आदि) की तुलना में जब कम ज्यामितीय / विशिष्ट दिनचर्या का प्रतिपादन होता है।

IMSL -

लाभ: बहुत पूर्ण संख्यात्मक पुस्तकालय। बहुत, बहुत तेज (माना जाता है कि सबसे तेज सॉल्वर)। अब तक का सबसे बड़ा, सबसे पूरा गणितीय एपीआई। व्यावसायिक रूप से समर्थित, परिपक्व और स्थिर।

डाउनसाइड्स: लागत - सस्ती नहीं। बहुत कम ज्यामितीय / विशिष्ट तरीके प्रदान करते हैं, इसलिए आपको अपनी रैखिक बीजगणित कक्षाओं के शीर्ष पर अपना रोल करना होगा।

NT2 -

लाभ: यदि आप MATLAB के लिए उपयोग किए जाते हैं तो सिंटैक्स अधिक परिचित है। पूर्ण परिपक्वता प्रदान करता है और बड़े मेट्रिसेस आदि के लिए समाधान करता है।

डाउनसाइड्स: गणितीय, केंद्रित नहीं प्रतिपादन। शायद नहीं के रूप में Eigen के रूप में।

लैपैक -

लाभ: बहुत स्थिर, सिद्ध एल्गोरिदम। काफी देर तक इधर-उधर रहा। पूर्ण मैट्रिक्स हल करना, आदि अस्पष्ट गणित के लिए कई विकल्प हैं।

डाउनसाइड्स: कुछ मामलों में अत्यधिक प्रदर्शन करने वाला नहीं। उपयोग के लिए अजीब एपीआई के साथ, फोरट्रान से पोर्ट किया गया।

व्यक्तिगत रूप से, मेरे लिए, यह एक ही सवाल पर आता है - आप इसे कैसे उपयोग करने की योजना बना रहे हैं। यदि आप फ़ोकस करते हैं तो केवल रेंडरिंग और ग्राफ़िक्स पर, मुझे जेनेरिक ग्राफ़िक्स टूलकिट पसंद है , क्योंकि यह अच्छा प्रदर्शन करता है, और अपने स्वयं के कार्यान्वयन के बिना कई उपयोगी रेंडरिंग ऑपरेशनों का समर्थन करता है। यदि आपको सामान्य प्रयोजन मैट्रिक्स हल करने की आवश्यकता है (यानी: बड़े मैट्रिक्स के एसवीडी या एलयू अपघटन), तो मैं ईजन के साथ जाऊंगा , क्योंकि यह संभालता है, कुछ ज्यामितीय संचालन प्रदान करता है, और बड़े मैट्रिक्स समाधानों के साथ बहुत अच्छा है। आपको अपने स्वयं के ग्राफिक्स / ज्यामितीय संचालन (उनके मेट्रिक्स / वैक्टर के शीर्ष पर) लिखने की आवश्यकता हो सकती है, लेकिन यह भयानक नहीं है।


आपने GMTL पर निर्णय लेने से पहले अन्य पुस्तकालयों का मूल्यांकन किया था? सतही तुलना मुझे विश्वास है कि Eigen बेहतर समर्थन किया गया था, लेकिन संबंधित वेबसाइटों की समीक्षा के आधार पर thats। क्या आप एक के बाद एक विशिष्ट लाभों से अवगत हैं?
कैटस्कुल

Eigen अच्छा काम करता है, भी। यह उस समय परिपक्व नहीं था जब मैंने अपनी जांच की थी, लेकिन मेरा मानना ​​है कि यह इस बिंदु पर एक अच्छा विकल्प होगा। GMTL का उपयोग व्यापक रूप से व्यापक रूप से किया गया है, और जब मैंने इसका उपयोग करने का निर्णय लिया तो बहुत परिपक्व और ठोस था।
रीड कोपसे

मुझे लगता है कि मेरे सवाल को बहुत ही बेरहमी से टालने का अनुमान है: क्या आपने अपनी पसंद को "यह बेहतर लग रहा है" या जहां विशिष्ट विशेषताएं (एपीआई, गति, मेमोरी उपयोग, चौड़ाई, संकीर्णता) है, जैसे अंतर को बनाया है। मुझे लगता है कि परिपक्वता इस मानदंड के अंतर्गत आती है, लेकिन यदि परिपक्वता केवल मीट्रिक होती, तो मुझे लगता है कि आपने BLAS या LAPACK आधारित विकल्प का चयन किया होता।
१:54:०४ पर कैटस्कुल

मैंने कई विकल्पों की कोशिश करने के बाद इसे चुना, और इसे बंद कर दिया: प्रदर्शन, प्रयोज्य और कम रनटाइम / संकलन समय उपरि। Eigen अब उस बिंदु पर की तुलना में बहुत बेहतर लग रहा है, इसलिए मैं उनके बीच न्याय नहीं कर सकता। हालाँकि, हम अपने उपयोगों के लिए GMTL से बहुत खुश हैं।
रीड कोपसे सिप

यही कारण है कि मुझे GMTL पसंद है, और इसका इस्तेमाल किया। यह सिर्फ उपयोग करने के लिए बहुत स्वाभाविक लगा, और साथ काम करने के लिए बहुत, बहुत आसान था। इसने इस मामले में मेरी जरूरत की हर चीज का भी समर्थन किया, क्योंकि मैं सीधे ज्यामितीय परिवर्तन और चतुष्कोणीय घुमाव को संभालने के बारे में चिंतित था।
रीड कोपसे सेप

38

तो मैं एक बहुत ही महत्वपूर्ण व्यक्ति हूं, और अगर मैं एक पुस्तकालय में निवेश करने जा रहा हूं, तो मुझे यह पता चलेगा कि मुझे पता है कि मैं खुद में क्या कर रहा हूं। मैं यह जाँचता हूँ कि आलोचना करने और चापलूसी करने पर प्रकाश पर भारी पड़ना बेहतर है; इसके साथ गलत क्या है भविष्य के लिए इसके कई निहितार्थ हैं जो सही है। इसलिए मैं इस तरह का जवाब देने के लिए थोड़ा और यहाँ पर जा रहा हूँ जिससे मुझे मदद मिली होगी और मुझे उम्मीद है कि इस रास्ते से नीचे जाने वाले दूसरों की मदद करेंगे। ध्यान रखें कि यह इन परिवादों के साथ मैंने क्या समीक्षा / परीक्षण पर आधारित है। ओह और मैंने रीड से कुछ सकारात्मक विवरण चुराए हैं।

मैं ऊपर उल्लेख करूँगा कि मैं idiosyncrasies के बावजूद GMTL के साथ गया था क्योंकि Eigen2 की अनिश्चितता एक नकारात्मक पक्ष से बहुत बड़ी थी। लेकिन मुझे हाल ही में पता चला है कि Eigen2 की अगली रिलीज़ में ऐसे परिभाषित होंगे जो संरेखण कोड को बंद कर देंगे, और इसे सुरक्षित बनाएंगे। इसलिए मैं स्विच कर सकता हूं।

अद्यतन : मैंने Eigen3 पर स्विच किया है। यह मूर्तियों के बावजूद, इसके दायरे और लालित्य को अनदेखा करना बहुत कठिन है, और जो अनुकूलन इसे असुरक्षित बनाते हैं उन्हें एक परिभाषित के साथ बंद किया जा सकता है।

Eigen2 / Eigen3

लाभ: LGPL MPL2, स्वच्छ, अच्छी तरह से डिजाइन एपीआई, उपयोग करने के लिए काफी आसान है। एक जीवंत समुदाय के साथ अच्छी तरह से बनाए रखा जाता है। कम मेमोरी ओवरहेड। उच्च प्रदर्शन। सामान्य रैखिक बीजगणित के लिए बनाया गया है, लेकिन अच्छी ज्यामितीय कार्यक्षमता भी उपलब्ध है। सभी हेडर लिब, कोई लिंकिंग की आवश्यकता नहीं है।

Idiocyncracies / downsides: (इनमें से कुछ / सभी को वर्तमान विकास शाखा Eigen3 में उपलब्ध कुछ परिभाषाओं द्वारा टाला जा सकता है )

  • असुरक्षित प्रदर्शन अनुकूलन के परिणामस्वरूप नियमों का पालन करने में सावधानी बरतने की आवश्यकता होती है। नियमों का पालन करने में विफलता दुर्घटनाओं का कारण बनती है।
    • आप बस सुरक्षित रूप से पास-बाय-वैल्यू नहीं कर सकते
    • सदस्यों के रूप में Eigen प्रकारों के उपयोग के लिए विशेष आवंटन अनुकूलन की आवश्यकता होती है (या आप क्रैश)
    • stl कंटेनर प्रकार और संभवतः अन्य टेम्पलेट्स के साथ विशेष आवंटन अनुकूलन की आवश्यकता होती है (या आप दुर्घटनाग्रस्त हो जाएंगे)
    • फंक्शन कॉल्स (GCC windows) पर क्रैश को रोकने के लिए कुछ कंपाइलरों को विशेष देखभाल की आवश्यकता होती है

GMTL

लाभ: LGPL, काफी सरल एपीआई, विशेष रूप से ग्राफिक्स इंजन के लिए डिज़ाइन किया गया। रेंडरिंग (जैसे विमान, AABB, कई प्रक्षेप के साथ quatenrions, आदि) की तरह कई आदिम प्रकार शामिल हैं जो किसी भी अन्य पैकेज में नहीं हैं। बहुत कम स्मृति उपरि, काफी तेज, प्रयोग करने में आसान। सभी हेडर आधारित, कोई लिंकिंग आवश्यक नहीं।

Idiocyncracies / कमियां:

  • एपीआई विचित्र है
    • myVec.x क्या हो सकता है () एक और परिवाद में केवल myVec [0] (पठनीयता समस्या) के माध्यम से उपलब्ध है
      • एक सरणी या stl :: बिंदुओं का वेक्टर आपको कुछ करने के लिए प्रेरित कर सकता है जैसे कि पॉइंटलिस्ट [0] [0] पहले बिंदु के x घटक तक पहुंचने के लिए
    • जब कंपाइलर अनावश्यक टेंपरेचर को खत्म कर देता है, तो अनुकूलन में एक भोले प्रयास में, क्रॉस (वीसी, वीसी) को हटा दिया और मेकक्रॉस (वीसी, वीसी, वीसी) के साथ बदल दिया।
    • जब तक आप कुछ अनुकूलन सुविधाओं को बंद नहीं करते हैं, तब तक सामान्य गणित के संचालन सामान्य प्रकारों को वापस नहीं करते हैं जैसे: vec1 - vec2सामान्य वेक्टर वापस नहीं करता length( vecA - vecB )है, भले ही vecC = vecA - vecBकाम करता है। आपको इस तरह लपेटना चाहिए:length( Vec( vecA - vecB ) )
    • वैक्टर पर संचालन सदस्यों के बजाय बाहरी कार्यों द्वारा प्रदान किया जाता है। इसके लिए आपको हर जगह गुंजाइश रिज़ॉल्यूशन का उपयोग करने की आवश्यकता हो सकती है क्योंकि सामान्य प्रतीक नाम टकरा सकते हैं
    • आपको करना होगा
        length( makeCross( vecA, vecB ) )
      या
        gmtl::length( gmtl::makeCross( vecA, vecB ) )
      जहाँ अन्यथा आप प्रयास कर सकते हैं
        vecA.cross( vecB ).length()
  • अच्छी तरह से बनाए रखा नहीं
    • अभी भी "बीटा" के रूप में दावा किया गया
    • सामान्य कार्यशीलता का उपयोग करने के लिए आवश्यक हेडर जैसे बुनियादी जानकारी को गायब करना
      • Vec.h में वैक्टर के लिए संचालन शामिल नहीं है, VecOps.h में कुछ हैं, अन्य उदाहरण के लिए Generate.h में हैं। VecOps.h में क्रॉस (vec &, vec &, vec &) [Generate.h में क्रॉस (vec & vec &)]
  • अपरिपक्व / अस्थिर एपीआई; अभी भी बदल रहा है।
    • उदाहरण के लिए "क्रॉस" "VecOps.h" से "Generate.h" में चला गया है, और फिर नाम को "मेकक्रॉस" में बदल दिया गया। दस्तावेज़ीकरण के उदाहरण विफल हो जाते हैं क्योंकि अभी भी उन कार्यों के पुराने संस्करणों को संदर्भित करते हैं जो अब मौजूद नहीं हैं।

NT2

नहीं बता सकते क्योंकि वे सामग्री की तुलना में अपने वेब पेज की फ्रैक्चर्ड इमेज हेडर में अधिक रुचि रखते हैं। एक गंभीर सॉफ्टवेयर प्रोजेक्ट की तुलना में एक अकादमिक परियोजना अधिक लगती है।

2 साल पहले नवीनतम रिलीज।

स्पष्ट रूप से अंग्रेजी में कोई दस्तावेज नहीं है, हालांकि माना जाता है कि फ्रांसीसी में कहीं कुछ है।

खिचड़ी भाषा परियोजना के चारों ओर एक समुदाय का पता लगाती है।

लैप और BLAS

लाभ: पुराना और परिपक्व।

downsides:

  • डायनासोर के रूप में पुराने वास्तव में भद्दा एपीआई के साथ

1
Eigen संरेखित मुखर के बारे में: डेटा के छोटे सेट के लिए SSE (1,2,3 या 4) संचालन से उच्च प्रदर्शन प्राप्त करने के लिए, आपको पूरी तरह से संरेखित डेटा की आवश्यकता है। अनलग्ड लोड / स्टोर संचालन बहुत धीमा है। संरेखित या अन-असाइन किए गए लोड / स्टोर के बीच का निर्णय भी समय लेता है। किसी भी "सामान्य उद्देश्य" के कार्यान्वयन में वास्तव में सभी के लिए सही काम करने में कठिन समय होगा, जब तक कि उन्होंने इंटरफ़ेस को "संरेखित" और "अलिखित" ऑपरेशन में भी अलग नहीं किया - और फिर यह बस बहुत सामान्य उद्देश्य नहीं है।
जोरिस टिम्मरमन्स

@ कैट्सकुल I Eigen3 का उपयोग करना चाहते हैं। क्या आप "उन अनुकूलन का विस्तार कर सकते हैं जो इसे असुरक्षित बनाते हैं जो एक परिभाषित के साथ बंद हो सकते हैं"? Eigen2 के अंतर्गत आपके द्वारा सूचीबद्ध अन्य मुद्दे ध्यान से संरेखण मुद्दों से संबंधित विषय के तहत डॉक्टर में विस्तृत हैं । मैं इन मुद्दों के साथ रह सकता हूं।
अली

सुरक्षा से संबंधित मुद्दे जिनका मैं सभी संरेखण से संबंधित हूं और Eigen2 से समान हैं। यदि आप Eigen2 के साथ ठीक हैं, तो आप Eigen3 के साथ ठीक रहेंगे।
कैटस्कूल

2
BLAS और LAPACK वास्तव में पुस्तकालय नहीं हैं, लेकिन विनिर्देशों / एपीआई। आप नेटलिब या अन्य कार्यान्वयन जैसे कि एटलस और ओपनबीएलएएस द्वारा उनके प्रारंभिक कार्यान्वयन का उल्लेख कर सकते हैं।
Foad

12

इसके लायक क्या है, मैंने ईजेन और आर्मडिलो दोनों की कोशिश की है। नीचे एक संक्षिप्त मूल्यांकन है।

Eigen लाभ: 1. पूरी तरह से आत्म निहित - बाहरी BLAS या LAPACK पर कोई निर्भरता नहीं। 2. प्रलेखन सभ्य। 3. पूरी तरह से तेजी से, हालांकि मैंने इसे परीक्षण में नहीं रखा है।

नुकसान: क्यू एल्गोरिथ्म सिर्फ एक मैट्रिक्स लौटाता है, ऊपरी मैट्रिक्स में आर मैट्रिक्स एम्बेडेड है। बाकी मैट्रिक्स कहाँ से आता है और कोई क्यू मैट्रिक्स नहीं पहुँचा जा सकता है, इसका कोई विचार नहीं है।

अर्माडिलो लाभ: 1. विघटन और अन्य कार्यों की विस्तृत श्रृंखला (क्यूआर सहित)। 2. उचित रूप से तेज़ (अभिव्यक्ति टेम्पलेट्स का उपयोग करता है), लेकिन फिर, मैंने वास्तव में इसे उच्च आयामों में नहीं धकेल दिया है।

नुकसान: 1. बाहरी बीएलएएस और / या मैट्रिक्स डिकम्पोजिशन के लिए लैपैक पर निर्भर करता है। 2. दस्तावेज़ीकरण में IMHO की कमी होती है ((#Dfine स्टेटमेंट बदलने के अलावा अन्य)

अच्छा होगा यदि एक खुला स्रोत पुस्तकालय उपलब्ध था जो कि स्व-निहित और उपयोग करने के लिए सीधा है। मैं 10 साल से इसी मुद्दे पर चला हूं, और इससे निराशा होती है। एक बिंदु पर, मैंने सी के लिए जीएसएल का उपयोग किया और इसके चारों ओर सी ++ रैपर्स लिखा, लेकिन आधुनिक सी ++ के साथ - विशेष रूप से अभिव्यक्ति टेम्पलेट्स के फायदे का उपयोग करते हुए - हमें 21 वीं शताब्दी में सी के साथ गड़बड़ नहीं करना चाहिए। बस मेरी तपस्नेपनी।


2
आर्मडिलो में एक जानबूझकर मैटलैब जैसा सिंटैक्स होता है, ताकि इसका उपयोग करना आसान हो। मुझे यकीन नहीं है कि आप के बारे में क्या मतलब है "प्रलेखन की कमी है ... विशेषण LAPACK"। दस्तावेज़ीकरण स्पष्ट रूप से सभी उपयोगकर्ता उपलब्ध कार्यों का दस्तावेज़ीकरण करता है, उदाहरण के साथ उनका उपयोग कैसे करें। C ++ रैपर लाइब्रेरी के बारे में संपूर्ण बिंदु LAPACK की जटिलता और क्रिया को दूर करना है। आप हमेशा स्रोत को ब्राउज़ कर सकते हैं यदि आप यह देखना चाहते हैं कि आर्मडिलो LAPACK को कैसे कॉल करता है।
mtall 10

Eigen में QR अपघटन के बारे में, क्या आपका मतलब है Eigen2 या Eigen3?
ed

11

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

एमकेएल तेजी से रन-टाइम प्रदर्शन के लिए सावधानी से अनुकूलित है - बहुत परिपक्व BLAS / LAPACK फोरट्रान मानकों पर आधारित है। और इसके प्रदर्शन उपलब्ध कोर की संख्या के साथ। उपलब्ध कोर के साथ हैंड्स-फ्री स्केलेबिलिटी कंप्यूटिंग का भविष्य है और मैं मल्टी-कोर प्रोसेसर का समर्थन नहीं करने वाले नए प्रोजेक्ट के लिए किसी भी गणित पुस्तकालय का उपयोग नहीं करूंगा।

बहुत संक्षेप में, इसमें शामिल हैं:

  1. मूल वेक्टर-वेक्टर, वेक्टर-मैट्रिक्स और मैट्रिक्स-मैट्रिक्स ऑपरेशन
  2. मैट्रिक्स कारक (LU अपघटन, हेर्मैटिनियन, विरल)
  3. कम से कम वर्ग फिटिंग और eigenvalue समस्याओं
  4. विरल लीनियर सिस्टम सॉल्वर्स
  5. गैर-रैखिक कम से कम वर्ग सॉल्वर (विश्वास क्षेत्रों)
  6. प्लस सिग्नल प्रोसेसिंग रूटीन जैसे एफएफटी और कनवल्शन
  7. बहुत तेजी से यादृच्छिक संख्या जनरेटर (mersenne मोड़)
  8. बहुत अधिक .... देखें: लिंक पाठ

एक नकारात्मक पहलू यह है कि MKL API आपके द्वारा आवश्यक दिनचर्या के आधार पर काफी जटिल हो सकता है। आप उनके IPP (इंटीग्रेटेड परफॉरमेंस प्राइमेटीज़) लाइब्रेरी पर भी नज़र डाल सकते हैं, जो उच्च प्रदर्शन इमेज प्रोसेसिंग ऑपरेशंस के लिए तैयार है, लेकिन फिर भी काफी व्यापक है।

पॉल

सेंटरस्पेस सॉफ्टवेयर, .NET मैथ लाइब्रेरी, सेंटर्सस्पेस


8

मैंने Eigen और NT2 के बारे में अच्छी बातें सुनी हैं , लेकिन व्यक्तिगत रूप से इसका उपयोग नहीं किया है। Boost.UBLAS भी है , जो मुझे विश्वास है कि दांत में थोड़ा लंबा हो रहा है। NT2 के डेवलपर्स इसे बूस्ट में लाने के इरादे से अगले संस्करण का निर्माण कर रहे हैं, ताकि किसी चीज़ की गिनती हो सके।

मेरा लिन। alg। 4x4 मैट्रिक्स केस से परे ज़रूरत नहीं है, इसलिए मैं उन्नत कार्यक्षमता पर टिप्पणी नहीं कर सकता; मैं सिर्फ कुछ विकल्पों की ओर इशारा कर रहा हूं।


मेरे अनुभव (बड़े मैट्रिसेस) में, Boost.UBLAS का अधिक उपयोग किया जाता है। हालाँकि, जब मैंने इस पर ध्यान दिया, तो मुझे यह पसंद नहीं आया (मुख्यतः प्रलेखन के कारण) इसलिए मैंने Eigen पर ध्यान केंद्रित किया। Eigen में एक ज्यामिति मॉड्यूल है , लेकिन मैंने इसे स्वयं उपयोग नहीं किया है।
जितसे निसेन

Eigen स्पष्ट रूप से ROS (विलो गेराज), सेलेस्टिया, कॉफ़िस और लिब्मव द्वारा उपयोग किया जाता है। मुझे UBLAS के बारे में कुछ बकबक देखने को मिल रहे हैं, लेकिन इस परियोजना के लिए एक कठिन समय आ रहा है जो इसका उपयोग कर रहा है। NT2 के लिए डिट्टो। क्या आप अच्छी बातों के बारे में विस्तार से बता सकते हैं?
Catskul

बूस्ट में आधुनिक लिनाअल्ग लाइब्रेरी को जोड़ने के बारे में बूस्ट मेलिंग सूची पर यह चर्चा में था - ईजन और एनटी 2 दोनों को संभावित उम्मीदवारों के रूप में उल्लेख किया गया था, लेकिन केवल एनटी 2 डेवलपर्स ने इसे आगे बढ़ाने में रुचि व्यक्त की। दोनों पुस्तकालय अच्छे लग रहे थे; जैसा कि आपने कहा, Eigen थोड़ा अधिक लोकप्रिय है, और अधिक C ++ - ish; NT2 को यथासंभव MATLAB की नकल करने के लिए डिज़ाइन किया गया है।
जेफ हार्डी

8

मैं इस विषय पर नया हूं, इसलिए मैं पूरी तरह से नहीं कह सकता, लेकिन वैज्ञानिक कंप्यूटिंग में BLAS बहुत मानक है। BLAS वास्तव में एक एपीआई मानक है, जिसमें कई कार्यान्वयन हैं। मुझे ईमानदारी से यकीन नहीं है कि कौन से कार्यान्वयन सबसे लोकप्रिय हैं या क्यों।

यदि आप सामान्य रेखीय बीजगणित संचालन (सिस्टम को हल करना, कम से कम वर्ग प्रतिगमन, अपघटन, आदि) करना चाहते हैं तो LAPACK में देखें


7

GLM के बारे में क्या ?

यह OpenGL शेडिंग लैंग्वेज (GLSL) विनिर्देश पर आधारित है और MIT लाइसेंस के तहत जारी किया गया है। स्पष्ट रूप से ग्राफिक्स प्रोग्रामर के उद्देश्य से


ठीक है, यह ग्राफिक्स प्रोग्रामिंग वेक्टर और मैट्रिसेस प्रदान करता है। यह GLSL पर शिकायत रखने के लिए ओवरहेड की अच्छी मात्रा का परिचय देता है (यदि आप इसे GLSL में कर सकते हैं, तो ज्यादातर बार यह GLSL में करना विशेष रूप से GL 4.x के साथ बेहतर है), और कई ग्राफिक्स प्रोग्रामिंग प्राइमेटिव्स (frum, AABB, BB, ellipsoid) को मिस करना )। इसका स्विज़ल इंटरफ़ेस यह मोटा है। बहुत बेहतर विकल्प होगा यदि इसमें कुछ कोड जनरेशन के साथ ".xyzz ()" फंक्शन्स हों। यह सही है जब आपको ओपेंगल एप्लिकेशन को प्रोटोटाइप करना पड़ता है और बड़ी परियोजनाओं पर इसके नकारात्मक पक्ष दिखाने लगते हैं। एक गणित पुस्तकालय कोड कभी नहीं।
कॉफडेवेलप्टर

5

मैं ईजन के लिए वोट जोड़ूंगा: मैंने विभिन्न पुस्तकालयों से बहुत सारे कोड (3 डी ज्यामिति, रैखिक बीजगणित और अंतर समीकरणों) को इस एक में चित्रित किया - लगभग सभी मामलों में प्रदर्शन और कोड पठनीयता दोनों में सुधार।

एक लाभ जिसका उल्लेख नहीं किया गया था: यह Eigen के साथ SSE का उपयोग करना बहुत आसान है, जो 2D-3D ऑपरेशन के प्रदर्शन में काफी सुधार करता है (जहां सब कुछ 128 बिट्स पर रखा जा सकता है)।


1
पूरे "यदि आप ऐसा करते हैं तो सुनिश्चित करें कि ..." बात मुझे लाल झंडे के एक बिट के रूप में मारती है। अब तक मैं इन मुद्दों में दो बार भाग चुका हूं और मैंने अभी इसका उपयोग शुरू किया है। मैं वास्तव में प्रत्येक पुस्तकालय की सभी प्रकार की पहचानों को जानने के लिए भविष्य के डेवलपर्स को बोझ नहीं करने की उम्मीद कर रहा था, इसमें शामिल हैं: विशेष रूप से संरेखण मुद्दे जहां यह दुर्घटनाग्रस्त हो जाता है यदि आप प्रत्येक बार आपके पास कुछ मैक्रोज़ का उपयोग नहीं करते हैं, और तथ्य यह है कि उन्होंने व्यक्ति के लिए कार्यक्षमता का प्रसार किया है कई हेडर में कक्षाएं। अकेले यह मुझे इसे चुनने से रोक नहीं सकता है, लेकिन यह थोड़ा लाल झंडा भेजा है।
Catskul

1
संरेखण और वह मैक्रो केवल तभी मायने रखता है जब आप SSE का उपयोग करते हैं, जो किसी भी तरह की आवश्यकता नहीं है। और यदि आप SIMD का उपयोग करते हैं, तो वे मुद्दे जो भी पुस्तकालय आप उपयोग करते हैं, उठेंगे। कम से कम ईजेन केवल दुर्घटना नहीं करता है, लेकिन सार्थक त्रुटि संदेश प्रदान करता है जो सीधे समस्या को इंगित करता है।
ima

और संरेखण मैक्रो से बचने का एक आसान तरीका है - सदस्यों के रूप में संकेत या संदर्भ का उपयोग करें।
ima

1
मुझे नहीं लगता कि यह सच है। मैंने कोई विशेष SSE विकल्प का उपयोग नहीं किया और इसे stl कंटेनरों के साथ उपयोग करने के बाद कई क्रैश हो गए। हाँ मुझे पता है कि यह आपको उपयोगी संदेश देता है, और हाँ मुझे पता है कि विशेष निर्देश हैं, लेकिन यह मेरी बात है। मैं प्रत्येक शामिल पुस्तकालय के लिए विशेष निर्देशों के साथ अन्य डेवलपर्स को बोझ नहीं करना चाहता। उदाहरण के लिए मूल्य बात से मत गुजरो अभी बहुत ज्यादा है।
कैटस्कूल

मुझे अभी पता चला है कि नवीनतम विकास शाखा में कुछ परिभाषित हैं जिनका उपयोग आप संरेखण को बंद करने और संबंधित मुद्दों से बचने के लिए कर सकते हैं।
कैटस्कुल

4

ठीक है, मुझे लगता है कि मुझे पता है कि आप क्या देख रहे हैं। ऐसा प्रतीत होता है कि जीजीटी एक बहुत अच्छा समाधान है, जैसा कि रीड कोपसी ने सुझाव दिया था।

व्यक्तिगत रूप से, हमने अपनी छोटी लाइब्रेरी को रोल किया, क्योंकि हम तर्कसंगत बिंदुओं के साथ बहुत कुछ करते हैं - बहुत सारे तर्कसंगत एनयूआरबीएस और बेजियर्स।

यह पता चला है कि अधिकांश 3 डी ग्राफिक्स लाइब्रेरी प्रोजेक्टिव बिंदुओं के साथ संगणना करते हैं, जिनका प्रोजेक्टिव गणित में कोई आधार नहीं है, क्योंकि यही वह है जो आप चाहते हैं कि आपको उत्तर मिल जाए। हमने ग्रासमैन बिंदुओं का उपयोग करके समाप्त किया, जिनके पास एक ठोस सैद्धांतिक आधार है और बिंदु प्रकारों की संख्या में कमी आई है। ग्रासमैन पॉइंट मूल रूप से समान गणना वाले लोग हैं जो अब एक मजबूत सिद्धांत के लाभ के साथ उपयोग कर रहे हैं। सबसे महत्वपूर्ण बात, यह हमारे दिमाग में चीजों को स्पष्ट करता है, इसलिए हमारे पास कम कीड़े हैं। रॉन गोल्डमैन ने कंप्यूटर ग्राफिक्स में ग्रासमैन बिंदुओं पर एक पेपर लिखा, जिसे " कंप्यूटर ग्राफिक्स के बीजगणित और ज्यामितीय नींव" कहा जाता है

सीधे आपके प्रश्न से संबंधित नहीं है, लेकिन एक दिलचस्प पढ़ा है।


यह जानबूझकर खुला है कि मैं इस बात से अनजान हूँ कि व्यापार बंद क्या है। यह कहना उचित है कि ज्यामिति हमारी मुख्य चिंता है ज्यामिति की गतिशीलता स्पष्ट नहीं है। वर्तमान में यह 2/3 (2 + समय) है और काल्पनिक रूप से काफी अधिक हो सकता है (3 डीआईएम + समय + मल्टी-डिम-कॉस्टैपैप्स)।
१०:१५ पर कैटस्कुल

मैं सवाल के साथ समझौता कर रहा हूँ। उदाहरण के लिए, इस प्रकार के बहुत सारे अनुप्रयोगों को वास्तविक समय (निरंतर समय व्यवहार) के प्रदर्शन की आवश्यकता होती है, जबकि कई अन्य सटीकता के लिए स्थिरता और / या गति देने के लिए ठीक हैं।
TED

तो क्या आप कह रहे हैं कि आपने जिन पुस्तकालयों की जांच की, उनमें से किसी ने भी NURBS और बेज़ियर की देखभाल नहीं की? मौजूदा पुस्तकालयों में से एक को नहीं लेने और इसके साथ-साथ एनयूआरबीएस और बेजियर समर्थन के निर्माण का कोई विशेष कारण?
Catskul

मैं जो कहना चाहता था, वह यह है कि तर्कसंगत NURBS और बेज़ियर तर्कसंगत नियंत्रण बिंदुओं का उपयोग सबसे अधिक 3D अनुप्रयोगों से करते हैं, इसलिए हम और अधिक गलतियाँ कर रहे थे। आमतौर पर ज्यादातर 3 डी ऐप्स में वनीला 3 डी पॉइंट और वैक्टर होते हैं, जब तक कि पर्सपेक्टिव ट्रांसफॉर्मेशन नहीं हो जाता। हमारे कई एल्गोरिदम को सही ढंग से भारित / तर्कसंगत / प्रक्षेप्य और कार्टेशियन बिंदुओं को संभालने में सक्षम होना चाहिए, आगे और पीछे जा रहे हैं आदि
tfinniga


0

मुझे यह लाइब्रेरी काफी सरल और कार्यात्मक लगी ( http://kirillsprograms.com/top_Vectors.php )। ये नंगे हड्डी वाले वैक्टर हैं जिन्हें C ++ टेम्प्लेट के माध्यम से कार्यान्वित किया जाता है। कोई फैंसी सामान नहीं - बस आपको वैक्टर के साथ क्या करना है (जोड़ें, घटाना गुणा, डॉट, आदि)।


1
दिसंबर 2019 तक लिंक दुर्भाग्य से टूटा हुआ है
10762409 का कहना है कि मोनिका
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.