पंक्ति प्रमुख बनाम कॉलम का मुख्य लेआउट


16

प्रोग्रामिंग में घनी मैट्रिक्स संगणना, क्या स्तंभ-प्रमुख लेआउट के ऊपर पंक्ति-प्रमुख लेआउट चुनने का कोई कारण है?

मुझे पता है कि चुने गए मैट्रिक्स के लेआउट के आधार पर, हमें गति के प्रयोजनों के लिए कैश यादों का प्रभावी ढंग से उपयोग करने के लिए उपयुक्त कोड लिखने की आवश्यकता है।

पंक्ति-प्रमुख लेआउट अधिक प्राकृतिक और सरल लगता है (कम से कम मेरे लिए)। लेकिन LAPACK जैसी प्रमुख लाइब्रेरी जो फोरट्रान में लिखी जाती हैं, कॉलम प्रमुख लेआउट का उपयोग करती हैं, इसलिए इस विकल्प को बनाने के लिए कुछ कारण होना चाहिए।


अगर हम x कॉलम वेक्टर के साथ b = A * x की गणना करते हैं, तो पंक्ति-प्रमुख A के लिए हम वैक्टर के आंतरिक उत्पादों का उपयोग कर सकते हैं, A (i::) ^ t x to get b (i); स्तंभ-प्रमुख के लिए हमें केवल स्केलर गुणा करने वाले वैक्टर की आवश्यकता हो सकती है, sum_i A (:, i) x (i)। यह मुझे लगता है कि स्तंभ प्रमुख बहुत बेहतर है! तुम क्या सोचते हो?
हुई झांग

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

जवाबों:


18

स्तंभ प्रमुख लेआउट फोरट्रान द्वारा उपयोग की जाने वाली योजना है और इसीलिए इसका उपयोग LAPACK और अन्य पुस्तकालयों में किया जाता है।

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

आंतरिक स्टोरेज कॉलम प्रमुख प्रारूप का आंतरिक भंडारण


11

किसी भी मौजूदा सॉफ़्टवेयर पर विचार किए बिना वैक्यूम में, पंक्ति बिंदु से अधिक प्रमुख स्तंभ को प्राथमिकता देने का कोई कारण नहीं है। हालांकि, अधिकांश गणितीय साहित्य इस तरह से लिखे गए हैं कि समूह मैट्रिक्स में पंक्तियों के बजाय स्तंभों के रूप में संग्रहीत करके वैक्टर में प्रवेश करते हैं। उदाहरण के लिए, जब आप पूर्ण eigenvalue समीकरण लिखना , एक्सएक्स=एक्सΛएक्समैट्रिक्स में स्तंभों में लिखे गए सभी eigenvectors शामिल हैं। आप वास्तव में कभी नहीं देखते हैं कि यह दूसरा तरीका लिखा है (हालांकि मैंने सुना है कि आंकड़े लोग पंक्ति वैक्टर की तरह हैं)। इसलिए, यह स्वाभाविक था कि सबसे पहले सॉफ्टवेयर ने कॉलम प्रमुख प्रारूप ग्रहण किया, ताकि यदि आपके पास एक मैट्रिक्स है जो वैक्टर का एक सेट है, तो किसी एकल वेक्टर का भंडारण सन्निहित है। इस प्रकार, मुझे लगता है कि परंपरा को वर्तमान समय के लिए आगे बढ़ाया गया है, और यदि आप तुए फोरट्रान के साथ बातचीत करना चाहते हैं, तो आप स्तंभ प्रमुख का उपयोग करना चाहते हैं। इतना बड़ा सभी अत्यधिक कुशल संख्यात्मक रैखिक बीजगणित स्तंभ प्रमुख में किया जाता है।

C मुख्य कारण पंक्ति है, इसके सरणी सिंटैक्स का कुछ परिणाम है; आप के रूप में 2 कॉलम सरणी द्वारा एक 3 पंक्ति की घोषणा करते हैं double a[3][2], और बाद में सूचकांक पहले के सूचकांकों की तुलना में तेजी से भिन्न होते हैं, जो 2 डी सरणियों के लिए इसे पंक्ति प्रमुख बनाता है। इसे प्राकृतिक पश्चिमी पढ़ने के क्रम से बाएं से दाएं से मिलाएं, यह पंक्ति को अधिक प्राकृतिक लगता है।


2
मुझे लगता है कि ये खराब तर्क हैं। यह तथ्य कि '' 'ए डबल' [a] [3] [2] '' 'में अंतिम इंडेक्स सबसे तेजी से बदलता है, यह कोई संयोग नहीं है - यह ठीक उसी तरह से एक शानदार डिजाइन निर्णय था जैसा कि फोर्ट्रान में एक सचेत डिजाइन निर्णय था इसे दूसरे तरीके से करें जब आपके पास '' 'वास्तविक (3,2)' '' सरणी हो।
वोल्फगैंग बैंगर्थ

1
इसके अलावा, यह किसी भी अधिक सच नहीं है कि सभी अत्यधिक कुशल संख्यात्मक रैखिक बीजगणित स्तंभ प्रमुख हैं। यह अभी भी BLAS और LAPACK के लिए सही हो सकता है, लेकिन यह पिछले 15 वर्षों में दिखाई देने वाली हर बड़ी रैखिक बीजगणित लाइब्रेरी के लिए बिल्कुल भी सच नहीं है: उदाहरण के लिए, PETSc और Trilinos दोनों पंक्ति प्रमुख विरल मैट्रिक्स भंडारण प्रारूपों का उपयोग करते हैं।
वोल्फगैंग बैंगर्थ

मुझे पता है कि सी कन्वेंशन एक सचेत निर्णय था, जो शायद प्राकृतिक पढ़ने के क्रम से दूर था। मेरा मतलब था कि यह शायद संख्यात्मक रेखीय बीजगणित को ध्यान में रखकर नहीं बनाया गया था, यह एक संयोग है कि यह पंक्ति प्रमुख है। दूसरा, मैंने विरल मैट्रिस के लिए, केवल घने के तर्क को रखने का इरादा नहीं किया। विरल के लिए, यह वहाँ मिश्रित पंक्ति और स्तंभ स्वरूपों दोनों के साथ मिश्रित पीठ का एक सा है।
विक्टर लियू

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

7
वहाँ हो गया, आदि C में कारण matrices सबसे तेजी से अंतिम सूचकांक चलते हैं क्योंकि C में matrices नहीं है। इसमें वैक्टर के वैक्टर हैं, जिन्हें पारदर्शी रूप से मेमोरी के ठोस ब्लॉकों के रूप में, या एरे के बिंदुओं के सरणियों के रूप में लागू किया जा सकता है। फोर्ट्रान के साथ अनुक्रमणिका-क्रम को सुसंगत बनाना (मैं अनुमान लगा रहा हूं) डेनिस रिची के रडार पर भी नहीं था।
20

2

कॉलम-मेजर ऑर्डर अधिक स्वाभाविक लगता है। उदाहरण के लिए मान लें कि यदि आप चित्र द्वारा फिल्म को फ़ाइल में सहेजना चाहते हैं तो आप कॉलम ऑर्डर का उपयोग कर रहे हैं, और यह बहुत सहज है और कोई भी इसे पंक्ति-प्रमुख क्रम में नहीं बचाएगा।

यदि आप C / C ++ में प्रोग्रामर हैं, तो आपको डिफ़ॉल्ट कॉलम-प्रमुख ऑर्डर के साथ मैट्रिसेस (Eigen, Armadillo, ...) के लिए कुछ उच्च स्तरीय पुस्तकालयों का उपयोग करना चाहिए। केवल पागल पंक्ति-प्रमुख क्रम के साथ कच्चे सी पॉइंटर्स का उपयोग करेंगे, हालांकि सी / सी ++ कुछ ऐसा प्रदान करता है जो मैट्रिक्स इंडेक्सिंग की याद दिलाता है।

सादगी के लिए पंक्ति-प्रमुख क्रम के साथ सब कुछ कम से कम अजीब गठन माना जाना चाहिए। स्लाइस द्वारा स्लाइस बस प्राकृतिक क्रम है और इसका अर्थ है स्तंभ-प्रमुख क्रम (जैसे फोरट्रान)। हमारे पिता / माताओं के पास बहुत अच्छे कारण थे कि उन्होंने इसे क्यों चुना।

दुर्भाग्य से पहले यह स्पष्ट हो गया था कि कई दिलचस्प पुस्तकालय पंक्ति-प्रमुख क्रम में बनाए गए थे, शायद अनुभव की कमी के कारण।

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


2

×n

  • मैं,जेमैं×+जे
  • मैं,जेजे×n+मैं

अब निम्नलिखित एल्गोरिथ्म की कल्पना करें:

for i from 1 to m
   for j from 1 to n
      do something with m(i,j)

मैं×+जे

निष्कर्ष:

  1. हां, इसका एक महत्व है, लेकिन विकल्प डेटा के एकत्र होने के तरीके पर निर्भर करता है। पिछले उदाहरण के लिए, यदि कॉलम-ऑर्डर का उपयोग किया जाता है, तो आप जो कर सकते हैं वह बस दो छोरों को स्वैप करना है।

  2. अंगूठे का नियम: स्मृति में क्रमिक स्थानों के लिए जल्दी-अलग-अलग सूचकांक मैप किया जाना चाहिए।

  3. अधिक महत्वपूर्ण बात, पसंद के प्रभाव को मापना / मानदंड मौलिक है, क्योंकि यह कई मापदंडों (डेटा का आकार, कैश का आकार, जिस तरह से प्रयुक्त भाषा कई सूचकांकों को रेखीय सूचकांक में मैप करता है, जिस तरह से ऑपरेटिंग है) पर निर्भर करता है सिस्टम वर्चुअल मेमोरी का प्रबंधन करता है, जिस तरह से लूप्स को रैखिक बीजगणित लाइब्रेरी में नेस्ट किया जाता है जो आप उपयोग करते हैं ...)

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