कुछ हद तक जवाब है कि यह बताता है कि सबसे अधिक तेजी से अलग-अलग छोड़ दिया जाने वाला सूचकांक सबसे अधिक कुशल क्यों है। दो प्रमुख बातें हैं जिन्हें आपको समझना आवश्यक है।
सबसे पहले, MATLAB (और फोरट्रान, लेकिन सी और अधिकांश अन्य प्रोग्रामिंग भाषाएं नहीं हैं) मेमोरी में सरणियों को "कॉलम प्रमुख क्रम में।" उदाहरण के लिए, यदि A 2 बाय 3 मैट्रिक्स 10 है, तो प्रविष्टियों को क्रम में मेमोरी में संग्रहीत किया जाएगा
ए (1,1,1)
ए (2,1,1)
ए (1,2,1)
ए (2,2,1)
ए (1,3,1)
ए (2,3,1)
ए (1,1,2)
ए (2,1,2)
...
ए (2,3,10)
स्तंभ प्रमुख आदेश की यह पसंद मनमानी है- हम आसानी से एक "पंक्ति प्रमुख आदेश" सम्मेलन को अपना सकते हैं, और वास्तव में यही सी और कुछ अन्य प्रोग्रामिंग भाषाओं में किया जाता है।
दूसरी महत्वपूर्ण बात जो आपको समझने की आवश्यकता है कि आधुनिक प्रोसेसर एक समय में मेमोरी को एक स्थान तक नहीं पहुंचाते हैं, बल्कि 64 या 128 सन्निकट बाइट्स (8 या 16 डबल सटीक फ़्लोटिंग पॉइंट नंबर) की "कैश लाइनों" को लोड और स्टोर करते हैं। स्मृति से एक समय में। डेटा का ये हिस्सा अस्थायी रूप से एक तेज़ मेमोरी कैश में संग्रहीत किया जाता है और आवश्यकतानुसार वापस लिखा जाता है। (व्यवहार में कैश आर्किटेक्चर अब कैश मेमोरी के 3 या 4 स्तरों के साथ काफी जटिल है, लेकिन मूल विचार को उस प्रकार के एक-स्तरीय कैश के साथ समझाया जा सकता है जो कंप्यूटर ने मेरे छोटे दिनों में किया था।)
A
यदि लूप को नेस्ट किया जाता है ताकि अंतरतम लूप पंक्ति सबस्क्रिप्ट को अपडेट करता है, तो सरणी प्रविष्टियों को क्रम ए (1,1), ए (2,1), ए (3,1), ... में एक्सेस किया जाएगा। पहली प्रविष्टि A (1,1) एक्सेस की गई है, सिस्टम मुख्य मेमोरी से कैश में A (1,1), A (2,1), ..., A (8,1) युक्त कैश लाइन लाएगा। । अंतरतम लूप के अगले 8 पुनरावृत्तियों इस डेटा पर बिना किसी अतिरिक्त मुख्य मेमोरी ट्रांसफर के काम करते हैं।
यदि विकल्प में, हम छोरों की संरचना करते हैं ताकि स्तंभ सूचकांक अंतरतम लूप में भिन्न हो, तो ए की प्रविष्टियों को ए (1,1), ए (1,2), ए (1,3) में एक्सेस किया जाएगा। ), ... इस मामले में, पहली पहुंच ए (1,1), ए (2,1), ..., ए (8,1) को मुख्य मेमोरी से कैश में लाएगी, लेकिन 7/8 इन प्रविष्टियों का उपयोग नहीं किया जाएगा। दूसरे पुनरावृत्ति में ए (1,2) तक पहुंच तब मुख्य मेमोरी से एक और 8 प्रविष्टियां लाएगा, और इसी तरह। जब तक कोड मैट्रिक्स की पंक्ति 2 पर काम करने के लिए चारों ओर हो जाता है, तब तक ए (2,1) प्रविष्टि को अन्य आवश्यक डेटा के लिए रास्ता बनाने के लिए कैश से बाहर निकाला जा सकता है। नतीजतन, कोड आवश्यक रूप से 8 गुना अधिक ट्रैफ़िक उत्पन्न कर रहा है।
कुछ अनुकूलन करने वाले कंपाइलर इस समस्या से बचने के लिए स्वचालित रूप से लूप्स को पुनर्गठन करने में सक्षम हैं।
मैट्रिक्स गुणन और गुणन के लिए कई संख्यात्मक रैखिक बीजगणित एल्गोरिदम को प्रोग्रामिंग भाषा के आधार पर पंक्ति-प्रमुख या स्तंभ-प्रमुख आदेश योजना के साथ कुशलता से काम करने के लिए अनुकूलित किया जा सकता है। इसे गलत तरीके से करने से प्रदर्शन पर महत्वपूर्ण नकारात्मक प्रभाव पड़ सकता है।
For
MATLAB में छोरों की गति बहुत धीमी है। आपको जब भी संभव हो MATLAB में स्पष्ट छोरों से बचना चाहिए। इसके बजाय, आमतौर पर एक समस्या मैट्रिक्स / वेक्टर संचालन के संदर्भ में व्यक्त की जा सकती है। यही MATLABic तरीका है। मैट्रिक्स को शुरू करने के लिए बहुत सारे अंतर्निहित कार्य भी हैं, उदाहरण के लिए, एक फ़ंक्शन, वाले () हैं , जो मैट्रिक्स के सभी तत्वों को 1 से (विस्तार द्वारा, किसी भी मूल्य पर गुणन द्वारा निर्धारित करेगा ) (सभी मैट्रिक्स द्वारा गुणा)))। यह 3-डी सरणियों पर भी काम करता है (जो मुझे लगता है कि यहां उदाहरण प्रस्तुत करता है)।