ऐरे प्रोग्रामिंग: Difference between revisions

From Vigyanwiki
No edit summary
No edit summary
Line 1: Line 1:
{{Short description|Applying operations to whole sets of values simultaneously}}
{{Short description|Applying operations to whole sets of values simultaneously}}
{{Programming paradigms}}
{{Programming paradigms}}
[[कंप्यूटर विज्ञान]] में, ऐरे प्रोग्रामिंग उन समाधानों को संदर्भित करता है जो ही बार में मूल्यों के पूरे सेट पर संचालन के अनुप्रयोग की अनुमति देता है। ऐसे समाधान आमतौर पर [[कम्प्यूटेशनल विज्ञान]] और [[ अभियांत्रिकी |अभियांत्रिकी]] सेटिंग्स में उपयोग किए जाते हैं।
[[कंप्यूटर विज्ञान]] में, ऐरे प्रोग्रामिंग उन समाधानों को संदर्भित करता है जो ही बार में मूल्यों के पूर्ण समूह पर संचालन के अनुप्रयोग की अनुमति देता है। ऐसे समाधान सामान्यतः [[कम्प्यूटेशनल विज्ञान]] और [[ अभियांत्रिकी |अभियांत्रिकी]] सेटिंग्स में उपयोग किए जाते हैं।


आधुनिक प्रोग्रामिंग भाषाएं जो ऐरे प्रोग्रामिंग (जिन्हें [[वेक्टर (डेटा संरचना)]] या बहुआयामी भाषाओं के रूप में भी जाना जाता है) का समर्थन करती हैं, विशेष रूप से [[वेक्टर (ज्यामितीय)]], [[मैट्रिक्स (गणित)]], और उच्चतर पर पारदर्शी रूप से लागू करने के लिए [[ अदिश (कंप्यूटिंग) |अदिश (कंप्यूटिंग)]] पर संचालन को सामान्य बनाने के लिए इंजीनियर की गई हैं। -आयामी सरणियाँ। इनमें [[एपीएल (प्रोग्रामिंग भाषा)]], [[जे (प्रोग्रामिंग भाषा)]], [[फोरट्रान 90]], मैटलैब, [[एनालिटिका (सॉफ्टवेयर)]], [[जीएनयू ऑक्टेव]], [[आर (प्रोग्रामिंग भाषा)]], [[ रेशम अधिक |रेशम अधिक]] , [[जूलिया (प्रोग्रामिंग भाषा)]], [[पर्ल डेटा भाषा]]|पर्ल डेटा लैंग्वेज ( पीडीएल)। इन भाषाओं में, संपूर्ण सरणियों पर संचालित होने वाले ऑपरेशन को ''वेक्टरीकृत'' ऑपरेशन कहा जा सकता है,<ref>{{cite journal |title=The NumPy array: a structure for efficient numerical computation |author=Stéfan van der Walt |author2=S. Chris Colbert |author3=Gaël Varoquaux |name-list-style=amp |journal=Computing in Science and Engineering |volume=13 |issue=2 |pages=22–30 |publisher=IEEE |year=2011 |doi=10.1109/mcse.2011.37|bibcode=2011CSE....13b..22V |arxiv=1102.1523 |s2cid=16907816 }}</ref> भले ही इसे [[वेक्टर प्रोसेसर]] पर निष्पादित किया गया हो, जो वेक्टर निर्देशों को लागू करता है। ऐरे प्रोग्रामिंग प्रिमिटिव डेटा हेरफेर के बारे में व्यापक विचार संक्षेप में व्यक्त करते हैं। कुछ मामलों में संक्षिप्तता का स्तर नाटकीय हो सकता है: यह असामान्य नहीं है ऐरे प्रोग्रामिंग भाषा [[एक-पंक्ति कार्यक्रम]]|वन-लाइनर खोजने के लिए जिसके लिए ऑब्जेक्ट-ओरिएंटेड कोड के कई पृष्ठों की आवश्यकता होती है।
आधुनिक प्रोग्रामिंग भाषाएं जो ऐरे प्रोग्रामिंग (जिन्हें [[वेक्टर (डेटा संरचना)|सदिश (डेटा संरचना)]] या बहुआयामी भाषाओं के रूप में भी जाना जाता है) का समर्थन करती हैं, विशेष रूप से [[वेक्टर (ज्यामितीय)|सदिश (ज्यामितीय)]], [[मैट्रिक्स (गणित)|आव्यूह (गणित)]], और उच्चतर पर पारदर्शी रूप से क्रियान्वित करने के लिए [[ अदिश (कंप्यूटिंग) |अदिश (कंप्यूटिंग)]] पर संचालन को सामान्य बनाने के लिए इंजीनियर की गई हैं। -आयामी सरणियाँ। इनमें [[एपीएल (प्रोग्रामिंग भाषा)]], [[जे (प्रोग्रामिंग भाषा)]], [[फोरट्रान 90]], मैटलैब, [[एनालिटिका (सॉफ्टवेयर)]], [[जीएनयू ऑक्टेव]], [[आर (प्रोग्रामिंग भाषा)]], [[ रेशम अधिक |रेशम अधिक]] , [[जूलिया (प्रोग्रामिंग भाषा)]], [[पर्ल डेटा भाषा]]|पर्ल डेटा भाषा ( पीडीएल)। इन भाषाओं में, संपूर्ण सरणियों पर संचालित होने वाले ऑपरेशन को सदिशीकृत ऑपरेशन कहा जा सकता है,<ref>{{cite journal |title=The NumPy array: a structure for efficient numerical computation |author=Stéfan van der Walt |author2=S. Chris Colbert |author3=Gaël Varoquaux |name-list-style=amp |journal=Computing in Science and Engineering |volume=13 |issue=2 |pages=22–30 |publisher=IEEE |year=2011 |doi=10.1109/mcse.2011.37|bibcode=2011CSE....13b..22V |arxiv=1102.1523 |s2cid=16907816 }}</ref> यदि इसे [[वेक्टर प्रोसेसर|सदिश प्रोसेसर]] पर निष्पादित किया गया हो, जो सदिश निर्देशों को क्रियान्वित करता है। ऐरे प्रोग्रामिंग प्रिमिटिव डेटा हेरफेर के बारे में व्यापक विचार संक्षेप में व्यक्त करते हैं। कुछ स्थितियों में संक्षिप्तता का स्तर नाटकीय हो सकता है: यह असामान्य नहीं है ऐरे प्रोग्रामिंग भाषा [[एक-पंक्ति कार्यक्रम]]|वन-लाइनर खोजने के लिए जिसके लिए ऑब्जेक्ट-ओरिएंटेड कोड के अनेक पृष्ठों की आवश्यकता होती है।


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


केनेथ ई. इवरसन ने ऐरे प्रोग्रामिंग (वास्तव में एपीएल का संदर्भ देते हुए) के पीछे के तर्क का वर्णन इस प्रकार किया:<ref>{{cite journal |author= Iverson, K. E. |title= विचार के एक उपकरण के रूप में संकेतन।|journal= Communications of the ACM |volume= 23 |issue= 8 |pages= 444–465 |year= 1980 |doi= 10.1145/358896.358899 |author-link= Kenneth E. Iverson |doi-access= free }}</ref>
केनेथ ई. इवरसन ने ऐरे प्रोग्रामिंग (वास्तव में एपीएल का संदर्भ देते हुए) के पीछे के तर्क का वर्णन इस प्रकार किया:<ref>{{cite journal |author= Iverson, K. E. |title= विचार के एक उपकरण के रूप में संकेतन।|journal= Communications of the ACM |volume= 23 |issue= 8 |pages= 444–465 |year= 1980 |doi= 10.1145/358896.358899 |author-link= Kenneth E. Iverson |doi-access= free }}</ref>
Line 17: Line 17:
Users of computers and programming languages are often concerned primarily with the efficiency of execution of algorithms, and might, therefore, summarily dismiss many of the algorithms presented here. Such dismissal would be short-sighted since a clear statement of an algorithm can usually be used as a basis from which one may easily derive a more efficient algorithm.}}
Users of computers and programming languages are often concerned primarily with the efficiency of execution of algorithms, and might, therefore, summarily dismiss many of the algorithms presented here. Such dismissal would be short-sighted since a clear statement of an algorithm can usually be used as a basis from which one may easily derive a more efficient algorithm.}}


सरणी प्रोग्रामिंग और सोच के पीछे का आधार डेटा के गुणों को ढूंढना और उनका दोहन करना है जहां व्यक्तिगत तत्व समान या आसन्न हैं। ऑब्जेक्ट ओरिएंटेशन के विपरीत, जो डेटा को उसके घटक भागों (या स्केलर (कंप्यूटिंग) मात्राओं) में स्पष्ट रूप से तोड़ देता है, एरे ओरिएंटेशन समूह डेटा को देखता है और समान हैंडलिंग लागू करता है।
सरणी प्रोग्रामिंग और सोच के पीछे का आधार डेटा के गुणों को ढूंढना और उनका दोहन करना है जहां व्यक्तिगत तत्व समान या आसन्न हैं। ऑब्जेक्ट ओरिएंटेशन के विपरीत, जो डेटा को उसके घटक भागों (या स्केलर (कंप्यूटिंग) मात्राओं) में स्पष्ट रूप से तोड़ देता है, एरे ओरिएंटेशन समूह डेटा को देखता है और समान हैंडलिंग क्रियान्वित करता है।


गणित में [[ टेन्सर |टेन्सर]] रैंक के अनुरूप, सामान्य रूप से प्रोग्रामिंग भाषाओं को व्यवस्थित करने के लिए [[फ़ंक्शन रैंक]] महत्वपूर्ण अवधारणा है: डेटा पर काम करने वाले फ़ंक्शन को उन आयामों की संख्या के आधार पर वर्गीकृत किया जा सकता है जिन पर वे कार्य करते हैं। उदाहरण के लिए, साधारण गुणन अदिश रैंक वाला फ़ंक्शन है क्योंकि यह शून्य-आयामी डेटा (व्यक्तिगत संख्या) पर काम करता है। [[ पार उत्पाद |पार उत्पाद]] ऑपरेशन वेक्टर रैंक फ़ंक्शन का उदाहरण है क्योंकि यह वैक्टर पर काम करता है, स्केलर पर नहीं। [[मैट्रिक्स गुणन]] 2-रैंक फ़ंक्शन का उदाहरण है, क्योंकि यह 2-आयामी वस्तुओं (मैट्रिसेस) पर काम करता है। [[कम करें (उच्च-क्रम फ़ंक्शन)]] इनपुट डेटा सरणी की आयामीता को या अधिक आयामों से कम करें। उदाहरण के लिए, तत्वों का योग इनपुट सरणी को 1 आयाम से संक्षिप्त कर देता है।
गणित में [[ टेन्सर |टेन्सर]] रैंक के अनुरूप, सामान्य रूप से प्रोग्रामिंग भाषाओं को व्यवस्थित करने के लिए [[फ़ंक्शन रैंक|फलन रैंक]] महत्वपूर्ण अवधारणा है: डेटा पर काम करने वाले फलन को उन आयामों की संख्या के आधार पर वर्गीकृत किया जा सकता है जिन पर वे कार्य करते हैं। उदाहरण के लिए, साधारण गुणन अदिश रैंक वाला फलन है जिससे कि यह शून्य-आयामी डेटा (व्यक्तिगत संख्या) पर काम करता है। [[ पार उत्पाद |पार उत्पाद]] ऑपरेशन सदिश रैंक फलन का उदाहरण है जिससे कि यह वैक्टर पर काम करता है, स्केलर पर नहीं। [[मैट्रिक्स गुणन|आव्यूह गुणन]] 2-रैंक फलन का उदाहरण है, जिससे कि यह 2-आयामी वस्तुओं (मैट्रिसेस) पर काम करता है। [[कम करें (उच्च-क्रम फ़ंक्शन)|कम करें (उच्च-क्रम फलन)]] इनपुट डेटा सरणी की आयामीता को या अधिक आयामों से कम करें। उदाहरण के लिए, तत्वों का योग इनपुट सरणी को 1 आयाम से संक्षिप्त कर देता है।


==उपयोग==
==उपयोग==
ऐरे प्रोग्रामिंग [[अंतर्निहित समानांतरीकरण]] के लिए बहुत उपयुक्त है; आजकल बहुत शोध का विषय है। इसके अलावा, 1997 के बाद विकसित और उत्पादित [[इंटेल]] और संगत सीपीयू में विभिन्न निर्देश सेट एक्सटेंशन शामिल थे, जो [[एमएमएक्स (निर्देश सेट)]] से शुरू होकर [[xxx]] 3 और 3डीनाउ! तक जारी थे, जिसमें अल्पविकसित एकल निर्देश, एकाधिक डेटा सरणी क्षमताएं शामिल थीं। ऐरे प्रसंस्करण [[समानांतर कंप्यूटिंग]] से अलग है जिसमें भौतिक प्रोसेसर साथ वस्तुओं के समूह पर संचालन करता है जबकि समानांतर प्रसंस्करण का उद्देश्य बड़ी समस्या को छोटे लोगों (एकाधिक निर्देश, कई डेटा) में विभाजित करना है ताकि कई प्रोसेसर द्वारा टुकड़ों में हल किया जा सके। दो या दो से अधिक कोर वाले प्रोसेसर आज तेजी से आम हो रहे हैं।
ऐरे प्रोग्रामिंग [[अंतर्निहित समानांतरीकरण]] के लिए बहुत उपयुक्त है; आजकल बहुत शोध का विषय है। इसके अतिरिक्त, 1997 के बाद विकसित और उत्पादित [[इंटेल]] और संगत सीपीयू में विभिन्न निर्देश समूह एक्सटेंशन सम्मिलित थे, जो [[एमएमएक्स (निर्देश सेट)]] से प्रारंभ होकर [[xxx]] 3 और 3डीनाउ! तक जारी थे, जिसमें अल्पविकसित एकल निर्देश, एकाधिक डेटा सरणी क्षमताएं सम्मिलित थीं। ऐरे प्रसंस्करण [[समानांतर कंप्यूटिंग]] से भिन्न है जिसमें भौतिक प्रोसेसर साथ वस्तुओं के समूह पर संचालन करता है जबकि समानांतर प्रसंस्करण का उद्देश्य बड़ी समस्या को छोटे लोगों (एकाधिक निर्देश, अनेक डेटा) में विभाजित करना है जिससे कि अनेक प्रोसेसर द्वारा टुकड़ों में हल किया जा सके। दो या दो से अधिक कोर वाले प्रोसेसर आज तेजी से आम हो रहे हैं।


==भाषाएँ==
==भाषाएँ==
सरणी प्रोग्रामिंग भाषाओं के विहित उदाहरण [[फोरट्रान]], एपीएल (प्रोग्रामिंग भाषा), और जे (प्रोग्रामिंग भाषा) हैं। अन्य में शामिल हैं: [[ए+ (प्रोग्रामिंग भाषा)]]|ए+, एनालिटिका (सॉफ्टवेयर), [[चैपल (प्रोग्रामिंग भाषा)]], [[आईडीएल (प्रोग्रामिंग भाषा)]], जूलिया (प्रोग्रामिंग भाषा), [[के (प्रोग्रामिंग भाषा)]], क्लोंग, क्यू (केएक्स सिस्टम्स [[सैक प्रोग्रामिंग भाषा]]) , MATLAB, GNU ऑक्टेव, [[साइलैब]], [[फ्रीमैट]], पर्ल डेटा लैंग्वेज, R (प्रोग्रामिंग लैंग्वेज), S-लैंग (प्रोग्रामिंग लैंग्वेज)|S-लैंग, SAC प्रोग्रामिंग लैंग्वेज, Nial प्रोग्रामिंग लैंग्वेज, ZPL (प्रोग्रामिंग लैंग्वेज), फ़्यूथर्क (प्रोग्रामिंग लैंग्वेज) ), और [[टीआई-बेसिक]]।
सरणी प्रोग्रामिंग भाषाओं के विहित उदाहरण [[फोरट्रान]], एपीएल (प्रोग्रामिंग भाषा), और जे (प्रोग्रामिंग भाषा) हैं। अन्य में सम्मिलित हैं: [[ए+ (प्रोग्रामिंग भाषा)]]|ए+, एनालिटिका (सॉफ्टवेयर), [[चैपल (प्रोग्रामिंग भाषा)]], [[आईडीएल (प्रोग्रामिंग भाषा)]], जूलिया (प्रोग्रामिंग भाषा), [[के (प्रोग्रामिंग भाषा)]], क्लोंग, क्यू (केएक्स सिस्टम्स [[सैक प्रोग्रामिंग भाषा]]) , MATLAB, जीएनयू ऑक्टेव, [[साइलैब]], [[फ्रीमैट]], पर्ल डेटा भाषा, आर (प्रोग्रामिंग भाषा), एस-लैंग (प्रोग्रामिंग भाषा)|एस-लैंग, एसएसी प्रोग्रामिंग भाषा, Nial प्रोग्रामिंग भाषा, जेडपीएल (प्रोग्रामिंग भाषा), फ़्यूथर्क (प्रोग्रामिंग भाषा) ), और [[टीआई-बेसिक]]।


===अदिश भाषाएँ===
===अदिश भाषाएँ===
[[सी (प्रोग्रामिंग भाषा)]] और [[पास्कल (प्रोग्रामिंग भाषा)]] जैसी स्केलर भाषाओं में, ऑपरेशन केवल एकल मानों पर लागू होते हैं, इसलिए ए+बी दो संख्याओं के जोड़ को व्यक्त करता है। ऐसी भाषाओं में, ऐरे को दूसरे ऐरे में जोड़ने के लिए इंडेक्सिंग और लूपिंग की आवश्यकता होती है, जिसकी कोडिंग कठिन होती है।
[[सी (प्रोग्रामिंग भाषा)]] और [[पास्कल (प्रोग्रामिंग भाषा)]] जैसी स्केलर भाषाओं में, ऑपरेशन केवल एकल मानों पर क्रियान्वित होते हैं, इसलिए ए+बी दो संख्याओं के जोड़ को व्यक्त करता है। ऐसी भाषाओं में, ऐरे को दूसरे ऐरे में जोड़ने के लिए इंडेक्सिंग और लूपिंग की आवश्यकता होती है, जिसकी कोडिंग कठिन होती है।
<syntaxhighlight lang="c">
<syntaxhighlight lang="c">
for (i = 0; i < n; i++)
for (i = 0; i < n; i++)
Line 42: Line 42:
a(:,:) = a(:,:) + b(:,:)
a(:,:) = a(:,:) + b(:,:)
</syntaxhighlight>
</syntaxhighlight>
जबकि सी जैसी स्केलर भाषाओं में भाषा के हिस्से के रूप में मूल सरणी प्रोग्रामिंग तत्व नहीं होते हैं, इसका मतलब यह नहीं है कि इन भाषाओं में लिखे गए प्रोग्राम कभी भी वेक्टराइजेशन की अंतर्निहित तकनीकों का लाभ नहीं उठाते हैं (यानी, सीपीयू के एकल निर्देश, एकाधिक डेटा | वेक्टर का उपयोग करना) -आधारित निर्देश यदि इसमें हैं या कई सीपीयू कोर का उपयोग करके)। कुछ अनुकूलन स्तरों पर [[जीएनयू कंपाइलर संग्रह]] जैसे कुछ सी कंपाइलर कोड के उन अनुभागों का पता लगाते हैं और वेक्टराइज़ करते हैं जो इसके अनुमान से निर्धारित होते हैं कि इससे लाभ होगा। अन्य दृष्टिकोण [[ओपनएमपी]] एपीआई द्वारा दिया गया है, जो कई सीपीयू कोर का लाभ उठाकर कोड के लागू अनुभागों को समानांतर करने की अनुमति देता है।
जबकि सी जैसी स्केलर भाषाओं में भाषा के भाग के रूप में मूल सरणी प्रोग्रामिंग तत्व नहीं होते हैं, इसका मतलब यह नहीं है कि इन भाषाओं में लिखे गए प्रोग्राम कभी भी सदिशाइजेशन की अंतर्निहित तकनीकों का लाभ नहीं उठाते हैं (अर्थात्, सीपीयू के एकल निर्देश, एकाधिक डेटा | सदिश का उपयोग करना) -आधारित निर्देश यदि इसमें हैं या अनेक सीपीयू कोर का उपयोग करके)। कुछ अनुकूलन स्तरों पर [[जीएनयू कंपाइलर संग्रह]] जैसे कुछ सी कंपाइलर कोड के उन अनुभागों का पता लगाते हैं और सदिशाइज़ करते हैं जो इसके अनुमान से निर्धारित होते हैं कि इससे लाभ होगा। अन्य दृष्टिकोण [[ओपनएमपी]] एपीआई द्वारा दिया गया है, जो अनेक सीपीयू कोर का लाभ उठाकर कोड के क्रियान्वित अनुभागों को समानांतर करने की अनुमति देता है।


===भाषाओं की सारणी===
===भाषाओं की सारणी===
सरणी भाषाओं में, स्केलर और सरणियों दोनों पर लागू होने के लिए संचालन को सामान्यीकृत किया जाता है। इस प्रकार, a+b दो अदिशों के योग को व्यक्त करता है यदि a और b अदिश हैं, या दो सरणियों के योग को व्यक्त करता है यदि वे सारणी हैं।
सरणी भाषाओं में, स्केलर और सरणियों दोनों पर क्रियान्वित होने के लिए संचालन को सामान्यीकृत किया जाता है। इस प्रकार, a+b दो अदिशों के योग को व्यक्त करता है यदि a और b अदिश हैं, या दो सरणियों के योग को व्यक्त करता है यदि वे सारणी हैं।


सारणी भाषा प्रोग्रामिंग को सरल बनाती है लेकिन संभवतः इसकी कीमत अमूर्त दंड के रूप में जानी जाती है।<ref>{{cite thesis|author=Surana P |title=भाषा सार का मेटा-संकलन।|year=2006 |url=https://dl.acm.org/doi/book/10.5555/1195058}}</ref><ref>{{cite web |last= Kuketayev |title= जावा में छोटी वस्तुओं के लिए डेटा एब्स्ट्रैक्शन पेनल्टी (डीएपी) बेंचमार्क।|url= http://www.adtmag.com/joop/article.aspx?id=4597 |access-date= 2008-03-17 |archive-url= https://web.archive.org/web/20090111091710/http://www.adtmag.com/joop/article.aspx?id=4597 |archive-date= 2009-01-11 |url-status= dead }}</ref><ref>{{Cite book |last1= Chatzigeorgiou |last2= Stephanides |editor-last= Blieberger |editor2-last= Strohmeier |contribution= Evaluating Performance and Power Of Object-Oriented Vs. Procedural Programming Languages |title= Proceedings - 7th International Conference on Reliable Software Technologies - Ada-Europe'2002 |year= 2002 |pages= 367 |publisher= Springer |url= https://books.google.com/books?id=QMalP1P2kAMC&q=%22abstraction+penalty%22 |isbn= 978-3-540-43784-0 }}</ref> चूँकि परिवर्धन बाकी कोडिंग से अलग-थलग किया जाता है, इसलिए वे इष्टतमतम [[एल्गोरिथम दक्षता]] कोड का उत्पादन नहीं कर सकते हैं। (उदाहरण के लिए, ही निष्पादन के दौरान ही सरणी के अन्य तत्वों को जोड़ने का बाद में सामना किया जा सकता है, जिससे अनावश्यक बार-बार लुकअप हो सकता है।) यहां तक ​​कि सबसे परिष्कृत अनुकूलन कंपाइलर के पास दो या दो से अधिक स्पष्ट रूप से अलग-अलग कार्यों को संयोजित करने में बेहद कठिन समय होगा जो दिखाई दे सकते हैं विभिन्न प्रोग्राम अनुभाग या उप-रूटीन, भले ही प्रोग्रामर आसानी से ऐसा कर सकता है, [[कम्प्यूटेशनल ओवरहेड]] को कम करने के लिए सरणी के ऊपर से ही पास पर रकम एकत्र करना)।
सारणी भाषा प्रोग्रामिंग को सरल बनाती है किन्तु संभवतः इसकी कीमत अमूर्त दंड के रूप में जानी जाती है।<ref>{{cite thesis|author=Surana P |title=भाषा सार का मेटा-संकलन।|year=2006 |url=https://dl.acm.org/doi/book/10.5555/1195058}}</ref><ref>{{cite web |last= Kuketayev |title= जावा में छोटी वस्तुओं के लिए डेटा एब्स्ट्रैक्शन पेनल्टी (डीएपी) बेंचमार्क।|url= http://www.adtmag.com/joop/article.aspx?id=4597 |access-date= 2008-03-17 |archive-url= https://web.archive.org/web/20090111091710/http://www.adtmag.com/joop/article.aspx?id=4597 |archive-date= 2009-01-11 |url-status= dead }}</ref><ref>{{Cite book |last1= Chatzigeorgiou |last2= Stephanides |editor-last= Blieberger |editor2-last= Strohmeier |contribution= Evaluating Performance and Power Of Object-Oriented Vs. Procedural Programming Languages |title= Proceedings - 7th International Conference on Reliable Software Technologies - Ada-Europe'2002 |year= 2002 |pages= 367 |publisher= Springer |url= https://books.google.com/books?id=QMalP1P2kAMC&q=%22abstraction+penalty%22 |isbn= 978-3-540-43784-0 }}</ref> चूँकि परिवर्धन बाकी कोडिंग से भिन्न-थलग किया जाता है, इसलिए वे इष्टतमतम [[एल्गोरिथम दक्षता]] कोड का उत्पादन नहीं कर सकते हैं। (उदाहरण के लिए, ही निष्पादन के समय ही सरणी के अन्य तत्वों को जोड़ने का बाद में सामना किया जा सकता है, जिससे अनावश्यक बार-बार लुकअप हो सकता है।) यहां तक ​​कि सबसे परिष्कृत अनुकूलन कंपाइलर के पास दो या दो से अधिक स्पष्ट रूप से भिन्न-भिन्न कार्यों को संयोजित करने में बेहद कठिन समय होगा जो दिखाई दे सकते हैं विभिन्न प्रोग्राम अनुभाग या उप-रूटीन, यदि प्रोग्रामर आसानी से ऐसा कर सकता है, [[कम्प्यूटेशनल ओवरहेड]] को कम करने के लिए सरणी के ऊपर से ही पास पर रकम एकत्र करना)।


====अदा====
====अदा====
पिछला C कोड Ada (प्रोग्रामिंग भाषा) भाषा में निम्नलिखित बन जाएगा,<ref>[http://www.adaic.org/standards/05rm/html/RM-TTL.html Ada Reference Manual]: [http://www.adaic.org/resources/add_content/standards/05rm/html/RM-G-3-1.html G.3.1 Real Vectors and Matrices]</ref> जो ऐरे-प्रोग्रामिंग सिंटैक्स का समर्थन करता है।
पिछला सी कोड Ada (प्रोग्रामिंग भाषा) भाषा में निम्नलिखित बन जाएगा,<ref>[http://www.adaic.org/standards/05rm/html/RM-TTL.html Ada Reference Manual]: [http://www.adaic.org/resources/add_content/standards/05rm/html/RM-G-3-1.html G.3.1 Real Vectors and Matrices]</ref> जो ऐरे-प्रोग्रामिंग सिंटैक्स का समर्थन करता है।
<syntaxhighlight lang="ada">
<syntaxhighlight lang="ada">
A := A + B;
A := A + B;
Line 71: Line 71:


====बुनियादी====
====बुनियादी====
[[डार्टमाउथ बेसिक]] के तीसरे संस्करण (1966) में मैट्रिक्स और ऐरे हेरफेर के लिए MAT स्टेटमेंट थे।
[[डार्टमाउथ बेसिक]] के तीसरे संस्करण (1966) में आव्यूह और ऐरे हेरफेर के लिए MAT स्टेटमेंट थे।
<syntaxhighlight lang="basic">
<syntaxhighlight lang="basic">
DIM A(4),B(4),C(4)
DIM A(4),B(4),C(4)
Line 80: Line 80:
</syntaxhighlight>
</syntaxhighlight>
====माता====
====माता====
[[था]] की मैट्रिक्स प्रोग्रामिंग भाषा माता ऐरे प्रोग्रामिंग का समर्थन करती है। नीचे, हम जोड़, गुणन, मैट्रिक्स और अदिश का जोड़, तत्व दर तत्व गुणन, सबस्क्रिप्टिंग और माता के कई व्युत्क्रम मैट्रिक्स कार्यों में से का वर्णन करते हैं।
[[था]] की आव्यूह प्रोग्रामिंग भाषा माता ऐरे प्रोग्रामिंग का समर्थन करती है। नीचे, हम जोड़, गुणन, आव्यूह और अदिश का जोड़, तत्व दर तत्व गुणन, सबस्क्रिप्टिंग और माता के अनेक व्युत्क्रम आव्यूह कार्यों में से का वर्णन करते हैं।
<syntaxhighlight lang="stata">
<syntaxhighlight lang="stata">
. mata:
. mata:
Line 178: Line 178:
A = A + B;
A = A + B;
</syntaxhighlight>
</syntaxhighlight>
MATLAB भाषा का प्रकार GNU ऑक्टेव भाषा है, जो संवर्धित असाइनमेंट के साथ मूल भाषा का विस्तार करती है:
MATLAB भाषा का प्रकार जीएनयू ऑक्टेव भाषा है, जो संवर्धित असाइनमेंट के साथ मूल भाषा का विस्तार करती है:
<syntaxhighlight lang="octave">
<syntaxhighlight lang="octave">
A += B;
A += B;
</syntaxhighlight>
</syntaxhighlight>
MATLAB और GNU ऑक्टेव दोनों मूल रूप से मैट्रिक्स गुणन, मैट्रिक्स व्युत्क्रम और [[रैखिक समीकरणों की प्रणाली]] के संख्यात्मक समाधान जैसे रैखिक बीजगणित संचालन का समर्थन करते हैं, यहां तक ​​कि मूर-पेनरोज़ स्यूडोइनवर्स का उपयोग भी करते हैं।<ref>{{cite web |title= जीएनयू ऑक्टेव मैनुअल। अंकगणितीय आपरेटर।|url= https://www.gnu.org/software/octave/doc/interpreter/Arithmetic-Ops.html |access-date= 2011-03-19}}</ref><ref>{{cite web |title= मैटलैब दस्तावेज़ीकरण। अंकगणितीय आपरेटर।|url= http://www.mathworks.com/help/techdoc/ref/arithmeticoperators.html |access-date= 2011-03-19}}</ref>
MATLAB और जीएनयू ऑक्टेव दोनों मूल रूप से आव्यूह गुणन, आव्यूह व्युत्क्रम और [[रैखिक समीकरणों की प्रणाली]] के संख्यात्मक समाधान जैसे रैखिक बीजगणित संचालन का समर्थन करते हैं, यहां तक ​​कि मूर-पेनरोज़ स्यूडोइनवर्स का उपयोग भी करते हैं।<ref>{{cite web |title= जीएनयू ऑक्टेव मैनुअल। अंकगणितीय आपरेटर।|url= https://www.gnu.org/software/octave/doc/interpreter/Arithmetic-Ops.html |access-date= 2011-03-19}}</ref><ref>{{cite web |title= मैटलैब दस्तावेज़ीकरण। अंकगणितीय आपरेटर।|url= http://www.mathworks.com/help/techdoc/ref/arithmeticoperators.html |access-date= 2011-03-19}}</ref>
दो सरणियों के आंतरिक उत्पाद का [[नियाल]] उदाहरण मूल मैट्रिक्स गुणन ऑपरेटर का उपयोग करके कार्यान्वित किया जा सकता है। अगर <code>a</code> आकार का पंक्ति वेक्टर है [1 एन] और <code>b</code> आकार [एन 1] का संगत कॉलम वेक्टर है।
 
सरणियों के आंतरिक उत्पाद का [[नियाल]] उदाहरण मूल आव्यूह गुणन ऑपरेटर का उपयोग करके कार्यान्वित किया जा सकता है। यदि <code>a</code> आकार का पंक्ति सदिश है [1 एन] और <code>b</code> आकार [एन 1] का संगत कॉलम सदिश है।


  ए * बी;
  ए * बी;
Line 191: Line 192:
  ए .* बी;
  ए .* बी;


समान संख्या में तत्वों वाले दो मैट्रिक्स के बीच आंतरिक उत्पाद को सहायक ऑपरेटर के साथ कार्यान्वित किया जा सकता है <code>(:)</code>, जो किसी दिए गए मैट्रिक्स को कॉलम वेक्टर और [[ खिसकाना |खिसकाना]] ऑपरेटर में दोबारा आकार देता है <code>'</code>:
समान संख्या में तत्वों वाले दो आव्यूह के मध्य आंतरिक उत्पाद को सहायक ऑपरेटर के साथ कार्यान्वित किया जा सकता है <code>(:)</code>, जो किसी दिए गए आव्यूह को कॉलम सदिश और [[ खिसकाना |खिसकाना]] ऑपरेटर को पुनः आकार देता है <code>'</code>:


  ए(:)' * बी(:);
  ए(:)' * बी(:);
Line 203: Line 204:


==== आर ====
==== आर ====
आर भाषा डिफ़ॉल्ट रूप से [[सरणी प्रतिमान]] का समर्थन करती है। निम्नलिखित उदाहरण दो आव्यूहों के गुणन की प्रक्रिया को दर्शाता है जिसके बाद अदिश (जो वास्तव में, एक-तत्व वेक्टर है) और वेक्टर को जोड़ा जाता है:
आर भाषा डिफ़ॉल्ट रूप से [[सरणी प्रतिमान]] का समर्थन करती है। निम्नलिखित उदाहरण दो आव्यूहों के गुणन की प्रक्रिया को दर्शाता है जिसके बाद अदिश (जो वास्तव में, एकल-तत्व सदिश है) और सदिश को जोड़ा जाता है:
<syntaxhighlight lang="r">
<syntaxhighlight lang="r">
> A <- matrix(1:6, nrow=2)                            # !!this has nrow=2 ... and A has 2 rows
> A <- matrix(1:6, nrow=2)                            # !!this has nrow=2 ... and A has 2 rows
Line 233: Line 234:


== गणितीय तर्क और भाषा संकेतन ==
== गणितीय तर्क और भाषा संकेतन ==
मैट्रिक्स लेफ्ट-डिवीजन ऑपरेटर मैट्रिक्स के कुछ अर्थ संबंधी गुणों को संक्षेप में व्यक्त करता है। जैसे कि अदिश समतुल्य में, यदि (निर्धारक) गुणांक (मैट्रिक्स) <code>A</code> शून्य नहीं है तो (वेक्टोरियल) समीकरण को हल करना संभव है <code>A * x = b</code> के व्युत्क्रम मैट्रिक्स द्वारा दोनों पक्षों को बाएँ-गुणा करके <code>A</code>: <code>A<sup>−1</sup></code> (MATLAB और GNU ऑक्टेव दोनों भाषाओं में: <code>A^-1</code>). निम्नलिखित गणितीय कथन कब लागू होते हैं <code>A</code> मैट्रिक्स रैंक#गुण [[वर्ग मैट्रिक्स]] है:
आव्यूह लेफ्ट-डिवीजन ऑपरेटर आव्यूह के कुछ अर्थ संबंधी गुणों को संक्षेप में व्यक्त करता है। जैसे कि अदिश समतुल्य में, यदि (निर्धारक) गुणांक (आव्यूह) <code>A</code> शून्य नहीं है तो (वेक्टोरियल) समीकरण को हल करना संभव है <code>A * x = b</code> के व्युत्क्रम आव्यूह द्वारा दोनों पक्षों को बाएँ-गुणा करके <code>A</code>: <code>A<sup>−1</sup></code> (MATLAB और जीएनयू ऑक्टेव दोनों भाषाओं में: <code>A^-1</code>). निम्नलिखित गणितीय कथन कब क्रियान्वित होते हैं <code>A</code> आव्यूह रैंक#गुण [[वर्ग मैट्रिक्स|वर्ग आव्यूह]] है:
:<code>A^-1 *(A * x)==A^-1 * (b)</code>
:<code>A^-1 *(A * x)==A^-1 * (b)</code>
:<code>(A^-1 * A)* x ==A^-1 * b</code> (मैट्रिक्स-गुणा साहचर्य)
:<code>(A^-1 * A)* x ==A^-1 * b</code> (आव्यूह-गुणा साहचर्य)
:<code>x = A^-1 * b</code>
:<code>x = A^-1 * b</code>
कहाँ <code>==</code> तुल्यता संबंधपरक ऑपरेटर है.
कहाँ <code>==</code> तुल्यता संबंधपरक ऑपरेटर है.
पिछले कथन भी वैध MATLAB अभिव्यक्ति हैं यदि तीसरे को दूसरों से पहले निष्पादित किया जाता है (राउंड-ऑफ त्रुटियों के कारण संख्यात्मक तुलना गलत हो सकती है)।
पिछले कथन भी वैध MATLAB अभिव्यक्ति हैं यदि तीसरे को दूसरों से पहले निष्पादित किया जाता है (राउंड-ऑफ त्रुटियों के कारण संख्यात्मक तुलना गलत हो सकती है)।


यदि सिस्टम अतिनिर्धारित है - तो वह <code>A</code> इसमें स्तंभों की तुलना में अधिक पंक्तियाँ हैं - छद्म व्युत्क्रम <code>A<sup>+</sup></code> (MATLAB और GNU ऑक्टेव भाषाओं में: <code>pinv(A)</code>) व्युत्क्रम को प्रतिस्थापित कर सकता है <code>A<sup>−1</sup></code>, निम्नलिखित नुसार:
यदि सिस्टम अतिनिर्धारित है - तो वह <code>A</code> इसमें स्तंभों की तुलना में अधिक पंक्तियाँ हैं - छद्म व्युत्क्रम <code>A<sup>+</sup></code> (MATLAB और जीएनयू ऑक्टेव भाषाओं में: <code>pinv(A)</code>) व्युत्क्रम को प्रतिस्थापित कर सकता है <code>A<sup>−1</sup></code>, निम्नलिखित नुसार:
:<code>pinv(A) *(A * x)==pinv(A) * (b)</code>
:<code>pinv(A) *(A * x)==pinv(A) * (b)</code>
:<code>(pinv(A) * A)* x ==pinv(A) * b</code> (मैट्रिक्स-गुणा साहचर्य)
:<code>(pinv(A) * A)* x ==pinv(A) * b</code> (आव्यूह-गुणा साहचर्य)
:<code>x = pinv(A) * b</code>
:<code>x = pinv(A) * b</code>
हालाँकि, ये समाधान न तो सबसे संक्षिप्त हैं (उदाहरण के लिए अभी भी अतिनिर्धारित प्रणालियों को उल्लेखनीय रूप से अलग करने की आवश्यकता बनी हुई है) और न ही सबसे कम्प्यूटेशनल रूप से कुशल हैं। अदिश समतुल्य पर दोबारा विचार करने पर बाद वाला बिंदु समझना आसान है <code>a * x = b</code>, जिसके लिए समाधान <code>x = a^-1 * b</code> अधिक कुशल के बजाय दो ऑपरेशनों की आवश्यकता होगी <code>x = b / a</code>.
चूँकि, ये समाधान न तो सबसे संक्षिप्त हैं (उदाहरण के लिए अभी भी अतिनिर्धारित प्रणालियों को उल्लेखनीय रूप से भिन्न करने की आवश्यकता बनी हुई है) और न ही सबसे कम्प्यूटेशनल रूप से कुशल हैं। अदिश समतुल्य पर दोबारा विचार करने पर बाद वाला बिंदु समझना आसान है <code>a * x = b</code>, जिसके लिए समाधान <code>x = a^-1 * b</code> अधिक कुशल के अतिरिक्त दो ऑपरेशनों की आवश्यकता होगी <code>x = b / a</code>.
समस्या यह है कि आम तौर पर मैट्रिक्स गुणन क्रमविनिमेयता नहीं है क्योंकि मैट्रिक्स मामले में अदिश समाधान के विस्तार के लिए आवश्यकता होगी:
समस्या यह है कि सामान्यतः आव्यूह गुणन क्रमविनिमेयता नहीं है जिससे कि आव्यूह मामले में अदिश समाधान के विस्तार के लिए आवश्यकता होगी:
:<code>(a * x)/ a ==b / a</code>
:<code>(a * x)/ a ==b / a</code>
:<code>(x * a)/ a ==b / a</code> (मैट्रिसेस के लिए क्रमपरिवर्तनशीलता मान्य नहीं है!)
:<code>(x * a)/ a ==b / a</code> (मैट्रिसेस के लिए क्रमपरिवर्तनशीलता मान्य नहीं है!)
:<code>x * (a / a)==b / a</code> (साहचर्य मैट्रिक्स के लिए भी लागू होता है)
:<code>x * (a / a)==b / a</code> (साहचर्य आव्यूह के लिए भी क्रियान्वित होता है)
:<code>x = b / a</code>
:<code>x = b / a</code>
MATLAB भाषा लेफ्ट-डिवीजन ऑपरेटर का परिचय देती है <code>\</code> अदिश मामले के साथ सादृश्य के आवश्यक भाग को बनाए रखने के लिए, इसलिए गणितीय तर्क को सरल बनाना और संक्षिप्तता को संरक्षित करना:
MATLAB भाषा लेफ्ट-डिवीजन ऑपरेटर का परिचय देती है <code>\</code> अदिश मामले के साथ सादृश्य के आवश्यक भाग को बनाए रखने के लिए, इसलिए गणितीय तर्क को सरल बनाना और संक्षिप्तता को संरक्षित करना:
Line 254: Line 256:
:<code>(A \ A)* x ==A \ b</code> (सहयोगिता आव्यूहों के लिए भी मान्य है, क्रमविनिमेयता की अब आवश्यकता नहीं है)
:<code>(A \ A)* x ==A \ b</code> (सहयोगिता आव्यूहों के लिए भी मान्य है, क्रमविनिमेयता की अब आवश्यकता नहीं है)
:<code>x = A \ b</code>
:<code>x = A \ b</code>
यह न केवल कोडिंग के दृष्टिकोण से बल्कि कम्प्यूटेशनल दक्षता परिप्रेक्ष्य से संक्षिप्त सरणी प्रोग्रामिंग का उदाहरण है, जो कई सरणी प्रोग्रामिंग भाषाओं में काफी कुशल रैखिक बीजगणित पुस्तकालयों जैसे स्वचालित रूप से ट्यून किए गए रैखिक बीजगणित सॉफ्टवेयर या [[LAPACK]] से लाभ उठाता है।<ref>{{cite web |title= जीएनयू ऑक्टेव मैनुअल। परिशिष्ट जी ऑक्टेव स्थापित करना।|url= https://www.gnu.org/software/octave/doc/interpreter/Installation.html |access-date= 2011-03-19}}</ref>
यह न केवल कोडिंग के दृष्टिकोण से बल्कि कम्प्यूटेशनल दक्षता परिप्रेक्ष्य से संक्षिप्त सरणी प्रोग्रामिंग का उदाहरण है, जो अनेक सरणी प्रोग्रामिंग भाषाओं में अधिक कुशल रैखिक बीजगणित पुस्तकालयों जैसे स्वचालित रूप से ट्यून किए गए रैखिक बीजगणित सॉफ्टवेयर या [[LAPACK]] से लाभ उठाता है।<ref>{{cite web |title= जीएनयू ऑक्टेव मैनुअल। परिशिष्ट जी ऑक्टेव स्थापित करना।|url= https://www.gnu.org/software/octave/doc/interpreter/Installation.html |access-date= 2011-03-19}}</ref>
इवरसन के पिछले उद्धरण पर लौटते हुए, इसके पीछे का तर्क अब स्पष्ट होना चाहिए: {{quote|it is important to distinguish the difficulty of describing and of learning a piece of notation from the difficulty of mastering its implications. For example, learning the rules for computing a matrix product is easy, but a mastery of its implications (such as its associativity, its distributivity over addition, and its ability to represent linear functions and geometric operations) is a different and much more difficult matter.
इवरसन के पिछले उद्धरण पर लौटते हुए, इसके पीछे का तर्क अब स्पष्ट होना चाहिए: {{quote|it is important to distinguish the difficulty of describing and of learning a piece of notation from the difficulty of mastering its implications. For example, learning the rules for computing a matrix product is easy, but a mastery of its implications (such as its associativity, its distributivity over addition, and its ability to represent linear functions and geometric operations) is a different and much more difficult matter.


Line 260: Line 262:


==तृतीय-पक्ष लाइब्रेरी==
==तृतीय-पक्ष लाइब्रेरी==
अधिक संक्षिप्त सार-संक्षेप प्रदान करने के लिए विशिष्ट और कुशल पुस्तकालयों का उपयोग अन्य प्रोग्रामिंग भाषाओं में भी आम है। [[C++]] में कई रैखिक बीजगणित पुस्तकालय भाषा की [[ऑपरेटर ओवरलोडिंग]] की क्षमता का फायदा उठाते हैं। कुछ मामलों में उन भाषाओं में बहुत ही संक्षिप्त अमूर्तता स्पष्ट रूप से सरणी प्रोग्रामिंग प्रतिमान से प्रभावित होती है, जैसे कि [[NumPy]] एक्सटेंशन लाइब्रेरी से Python (प्रोग्रामिंग भाषा), [[आर्माडिलो (C++ लाइब्रेरी)]] और [[ब्लिट्ज़++]] लाइब्रेरीज़ ऐसा करती हैं।<ref>{{cite web |title= Reference for Armadillo 1.1.8. Examples of Matlab/Octave syntax and conceptually corresponding Armadillo syntax. |url= http://arma.sourceforge.net/docs.html#syntax |access-date= 2011-03-19}}</ref><ref>{{cite web |title= Blitz++ User's Guide. 3. Array Expressions. |url= http://www.oonumerics.org/blitz/docs/blitz_3.html#SEC80 |access-date= 2011-03-19 |archive-url= https://web.archive.org/web/20110323013142/http://www.oonumerics.org/blitz/docs/blitz_3.html#SEC80 |archive-date= 2011-03-23 |url-status= dead }}</ref>
अधिक संक्षिप्त सार-संक्षेप प्रदान करने के लिए विशिष्ट और कुशल पुस्तकालयों का उपयोग अन्य प्रोग्रामिंग भाषाओं में भी आम है। [[C++]] में अनेक रैखिक बीजगणित पुस्तकालय भाषा की [[ऑपरेटर ओवरलोडिंग]] की क्षमता का फायदा उठाते हैं। कुछ स्थितियों में उन भाषाओं में बहुत ही संक्षिप्त अमूर्तता स्पष्ट रूप से सरणी प्रोग्रामिंग प्रतिमान से प्रभावित होती है, जैसे कि [[NumPy]] एक्सटेंशन लाइब्रेरी से Python (प्रोग्रामिंग भाषा), [[आर्माडिलो (C++ लाइब्रेरी)]] और [[ब्लिट्ज़++]] लाइब्रेरीज़ ऐसा करती हैं।<ref>{{cite web |title= Reference for Armadillo 1.1.8. Examples of Matlab/Octave syntax and conceptually corresponding Armadillo syntax. |url= http://arma.sourceforge.net/docs.html#syntax |access-date= 2011-03-19}}</ref><ref>{{cite web |title= Blitz++ User's Guide. 3. Array Expressions. |url= http://www.oonumerics.org/blitz/docs/blitz_3.html#SEC80 |access-date= 2011-03-19 |archive-url= https://web.archive.org/web/20110323013142/http://www.oonumerics.org/blitz/docs/blitz_3.html#SEC80 |archive-date= 2011-03-23 |url-status= dead }}</ref>
==यह भी देखें==
==यह भी देखें==
* सारणी काटना
* सारणी काटना

Revision as of 00:20, 2 July 2023

कंप्यूटर विज्ञान में, ऐरे प्रोग्रामिंग उन समाधानों को संदर्भित करता है जो ही बार में मूल्यों के पूर्ण समूह पर संचालन के अनुप्रयोग की अनुमति देता है। ऐसे समाधान सामान्यतः कम्प्यूटेशनल विज्ञान और अभियांत्रिकी सेटिंग्स में उपयोग किए जाते हैं।

आधुनिक प्रोग्रामिंग भाषाएं जो ऐरे प्रोग्रामिंग (जिन्हें सदिश (डेटा संरचना) या बहुआयामी भाषाओं के रूप में भी जाना जाता है) का समर्थन करती हैं, विशेष रूप से सदिश (ज्यामितीय), आव्यूह (गणित), और उच्चतर पर पारदर्शी रूप से क्रियान्वित करने के लिए अदिश (कंप्यूटिंग) पर संचालन को सामान्य बनाने के लिए इंजीनियर की गई हैं। -आयामी सरणियाँ। इनमें एपीएल (प्रोग्रामिंग भाषा), जे (प्रोग्रामिंग भाषा), फोरट्रान 90, मैटलैब, एनालिटिका (सॉफ्टवेयर), जीएनयू ऑक्टेव, आर (प्रोग्रामिंग भाषा), रेशम अधिक , जूलिया (प्रोग्रामिंग भाषा), पर्ल डेटा भाषा|पर्ल डेटा भाषा ( पीडीएल)। इन भाषाओं में, संपूर्ण सरणियों पर संचालित होने वाले ऑपरेशन को सदिशीकृत ऑपरेशन कहा जा सकता है,[1] यदि इसे सदिश प्रोसेसर पर निष्पादित किया गया हो, जो सदिश निर्देशों को क्रियान्वित करता है। ऐरे प्रोग्रामिंग प्रिमिटिव डेटा हेरफेर के बारे में व्यापक विचार संक्षेप में व्यक्त करते हैं। कुछ स्थितियों में संक्षिप्तता का स्तर नाटकीय हो सकता है: यह असामान्य नहीं है ऐरे प्रोग्रामिंग भाषा एक-पंक्ति कार्यक्रम|वन-लाइनर खोजने के लिए जिसके लिए ऑब्जेक्ट-ओरिएंटेड कोड के अनेक पृष्ठों की आवश्यकता होती है।

सरणी की अवधारणाएँ

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

केनेथ ई. इवरसन ने ऐरे प्रोग्रामिंग (वास्तव में एपीएल का संदर्भ देते हुए) के पीछे के तर्क का वर्णन इस प्रकार किया:[2]

most programming languages are decidedly inferior to mathematical notation and are little used as tools of thought in ways that would be considered significant by, say, an applied mathematician.

The thesis is that the advantages of executability and universality found in programming languages can be effectively combined, in a single coherent language, with the advantages offered by mathematical notation. it is important to distinguish the difficulty of describing and of learning a piece of notation from the difficulty of mastering its implications. For example, learning the rules for computing a matrix product is easy, but a mastery of its implications (such as its associativity, its distributivity over addition, and its ability to represent linear functions and geometric operations) is a different and much more difficult matter.

Indeed, the very suggestiveness of a notation may make it seem harder to learn because of the many properties it suggests for explorations.

[...]

Users of computers and programming languages are often concerned primarily with the efficiency of execution of algorithms, and might, therefore, summarily dismiss many of the algorithms presented here. Such dismissal would be short-sighted since a clear statement of an algorithm can usually be used as a basis from which one may easily derive a more efficient algorithm.

सरणी प्रोग्रामिंग और सोच के पीछे का आधार डेटा के गुणों को ढूंढना और उनका दोहन करना है जहां व्यक्तिगत तत्व समान या आसन्न हैं। ऑब्जेक्ट ओरिएंटेशन के विपरीत, जो डेटा को उसके घटक भागों (या स्केलर (कंप्यूटिंग) मात्राओं) में स्पष्ट रूप से तोड़ देता है, एरे ओरिएंटेशन समूह डेटा को देखता है और समान हैंडलिंग क्रियान्वित करता है।

गणित में टेन्सर रैंक के अनुरूप, सामान्य रूप से प्रोग्रामिंग भाषाओं को व्यवस्थित करने के लिए फलन रैंक महत्वपूर्ण अवधारणा है: डेटा पर काम करने वाले फलन को उन आयामों की संख्या के आधार पर वर्गीकृत किया जा सकता है जिन पर वे कार्य करते हैं। उदाहरण के लिए, साधारण गुणन अदिश रैंक वाला फलन है जिससे कि यह शून्य-आयामी डेटा (व्यक्तिगत संख्या) पर काम करता है। पार उत्पाद ऑपरेशन सदिश रैंक फलन का उदाहरण है जिससे कि यह वैक्टर पर काम करता है, स्केलर पर नहीं। आव्यूह गुणन 2-रैंक फलन का उदाहरण है, जिससे कि यह 2-आयामी वस्तुओं (मैट्रिसेस) पर काम करता है। कम करें (उच्च-क्रम फलन) इनपुट डेटा सरणी की आयामीता को या अधिक आयामों से कम करें। उदाहरण के लिए, तत्वों का योग इनपुट सरणी को 1 आयाम से संक्षिप्त कर देता है।

उपयोग

ऐरे प्रोग्रामिंग अंतर्निहित समानांतरीकरण के लिए बहुत उपयुक्त है; आजकल बहुत शोध का विषय है। इसके अतिरिक्त, 1997 के बाद विकसित और उत्पादित इंटेल और संगत सीपीयू में विभिन्न निर्देश समूह एक्सटेंशन सम्मिलित थे, जो एमएमएक्स (निर्देश सेट) से प्रारंभ होकर xxx 3 और 3डीनाउ! तक जारी थे, जिसमें अल्पविकसित एकल निर्देश, एकाधिक डेटा सरणी क्षमताएं सम्मिलित थीं। ऐरे प्रसंस्करण समानांतर कंप्यूटिंग से भिन्न है जिसमें भौतिक प्रोसेसर साथ वस्तुओं के समूह पर संचालन करता है जबकि समानांतर प्रसंस्करण का उद्देश्य बड़ी समस्या को छोटे लोगों (एकाधिक निर्देश, अनेक डेटा) में विभाजित करना है जिससे कि अनेक प्रोसेसर द्वारा टुकड़ों में हल किया जा सके। दो या दो से अधिक कोर वाले प्रोसेसर आज तेजी से आम हो रहे हैं।

भाषाएँ

सरणी प्रोग्रामिंग भाषाओं के विहित उदाहरण फोरट्रान, एपीएल (प्रोग्रामिंग भाषा), और जे (प्रोग्रामिंग भाषा) हैं। अन्य में सम्मिलित हैं: ए+ (प्रोग्रामिंग भाषा)|ए+, एनालिटिका (सॉफ्टवेयर), चैपल (प्रोग्रामिंग भाषा), आईडीएल (प्रोग्रामिंग भाषा), जूलिया (प्रोग्रामिंग भाषा), के (प्रोग्रामिंग भाषा), क्लोंग, क्यू (केएक्स सिस्टम्स सैक प्रोग्रामिंग भाषा) , MATLAB, जीएनयू ऑक्टेव, साइलैब, फ्रीमैट, पर्ल डेटा भाषा, आर (प्रोग्रामिंग भाषा), एस-लैंग (प्रोग्रामिंग भाषा)|एस-लैंग, एसएसी प्रोग्रामिंग भाषा, Nial प्रोग्रामिंग भाषा, जेडपीएल (प्रोग्रामिंग भाषा), फ़्यूथर्क (प्रोग्रामिंग भाषा) ), और टीआई-बेसिक

अदिश भाषाएँ

सी (प्रोग्रामिंग भाषा) और पास्कल (प्रोग्रामिंग भाषा) जैसी स्केलर भाषाओं में, ऑपरेशन केवल एकल मानों पर क्रियान्वित होते हैं, इसलिए ए+बी दो संख्याओं के जोड़ को व्यक्त करता है। ऐसी भाषाओं में, ऐरे को दूसरे ऐरे में जोड़ने के लिए इंडेक्सिंग और लूपिंग की आवश्यकता होती है, जिसकी कोडिंग कठिन होती है।

for (i = 0; i < n; i++)
    for (j = 0; j < n; j++)
        a[i][j] += b[i][j];

सरणी-आधारित भाषाओं में, उदाहरण के लिए फ़ोरट्रान में, ऊपर दिए गए नेस्टेड फ़ॉर-लूप को पंक्ति में सरणी-प्रारूप में लिखा जा सकता है,

a = a + b

या वैकल्पिक रूप से, वस्तुओं की सरणी प्रकृति पर जोर देने के लिए,

a(:,:) = a(:,:) + b(:,:)

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

भाषाओं की सारणी

सरणी भाषाओं में, स्केलर और सरणियों दोनों पर क्रियान्वित होने के लिए संचालन को सामान्यीकृत किया जाता है। इस प्रकार, a+b दो अदिशों के योग को व्यक्त करता है यदि a और b अदिश हैं, या दो सरणियों के योग को व्यक्त करता है यदि वे सारणी हैं।

सारणी भाषा प्रोग्रामिंग को सरल बनाती है किन्तु संभवतः इसकी कीमत अमूर्त दंड के रूप में जानी जाती है।[3][4][5] चूँकि परिवर्धन बाकी कोडिंग से भिन्न-थलग किया जाता है, इसलिए वे इष्टतमतम एल्गोरिथम दक्षता कोड का उत्पादन नहीं कर सकते हैं। (उदाहरण के लिए, ही निष्पादन के समय ही सरणी के अन्य तत्वों को जोड़ने का बाद में सामना किया जा सकता है, जिससे अनावश्यक बार-बार लुकअप हो सकता है।) यहां तक ​​कि सबसे परिष्कृत अनुकूलन कंपाइलर के पास दो या दो से अधिक स्पष्ट रूप से भिन्न-भिन्न कार्यों को संयोजित करने में बेहद कठिन समय होगा जो दिखाई दे सकते हैं विभिन्न प्रोग्राम अनुभाग या उप-रूटीन, यदि प्रोग्रामर आसानी से ऐसा कर सकता है, कम्प्यूटेशनल ओवरहेड को कम करने के लिए सरणी के ऊपर से ही पास पर रकम एकत्र करना)।

अदा

पिछला सी कोड Ada (प्रोग्रामिंग भाषा) भाषा में निम्नलिखित बन जाएगा,[6] जो ऐरे-प्रोग्रामिंग सिंटैक्स का समर्थन करता है।

A := A + B;

एपीएल

एपीएल बिना वाक्यात्मक शर्करा के एकल वर्ण यूनिकोड प्रतीकों का उपयोग करता है।

A  A + B

यह ऑपरेशन किसी भी रैंक (रैंक 0 सहित) के सरणियों और स्केलर और ऐरे पर काम करता है। Dyalog APL संवर्धित असाइनमेंट के साथ मूल भाषा का विस्तार करता है:

A + B

एनालिटिका

एनालिटिका एडा के समान ही अभिव्यक्ति की अर्थव्यवस्था प्रदान करती है। <पूर्व> ए := ए + बी; </पूर्व>

बुनियादी

डार्टमाउथ बेसिक के तीसरे संस्करण (1966) में आव्यूह और ऐरे हेरफेर के लिए MAT स्टेटमेंट थे।

DIM A(4),B(4),C(4)
MAT A = 1
MAT B = 2 * A
MAT C = A + B
MAT PRINT A,B,C

माता

था की आव्यूह प्रोग्रामिंग भाषा माता ऐरे प्रोग्रामिंग का समर्थन करती है। नीचे, हम जोड़, गुणन, आव्यूह और अदिश का जोड़, तत्व दर तत्व गुणन, सबस्क्रिप्टिंग और माता के अनेक व्युत्क्रम आव्यूह कार्यों में से का वर्णन करते हैं।

. mata:

: A = (1,2,3) \(4,5,6)

: A
       1   2   3
    +-------------+
  1 |  1   2   3  |
  2 |  4   5   6  |
    +-------------+

: B = (2..4) \(1..3)

: B
       1   2   3
    +-------------+
  1 |  2   3   4  |
  2 |  1   2   3  |
    +-------------+

: C = J(3,2,1)           // A 3 by 2 matrix of ones

: C
       1   2
    +---------+
  1 |  1   1  |
  2 |  1   1  |
  3 |  1   1  |
    +---------+

: D = A + B

: D
       1   2   3
    +-------------+
  1 |  3   5   7  |
  2 |  5   7   9  |
    +-------------+

: E = A*C

: E
        1    2
    +-----------+
  1 |   6    6  |
  2 |  15   15  |
    +-----------+

: F = A:*B

: F
        1    2    3
    +----------------+
  1 |   2    6   12  |
  2 |   4   10   18  |
    +----------------+

: G = E :+ 3

: G
        1    2
    +-----------+
  1 |   9    9  |
  2 |  18   18  |
    +-----------+

: H = F[(2\1), (1, 2)]    // Subscripting to get a submatrix of F and

:                         // switch row 1 and 2
: H
        1    2
    +-----------+
  1 |   4   10  |
  2 |   2    6  |
    +-----------+

: I = invsym(F'*F)        // Generalized inverse (F*F^(-1)F=F) of a

:                         // symmetric positive semi-definite matrix
: I
[symmetric]
                 1             2             3
    +-------------------------------------------+
  1 |            0                              |
  2 |            0          3.25                |
  3 |            0         -1.75   .9444444444  |
    +-------------------------------------------+

: end

MATLAB

MATLAB में कार्यान्वयन फोरट्रान भाषा का उपयोग करके उसी अर्थव्यवस्था की अनुमति देता है।

A = A + B;

MATLAB भाषा का प्रकार जीएनयू ऑक्टेव भाषा है, जो संवर्धित असाइनमेंट के साथ मूल भाषा का विस्तार करती है:

A += B;

MATLAB और जीएनयू ऑक्टेव दोनों मूल रूप से आव्यूह गुणन, आव्यूह व्युत्क्रम और रैखिक समीकरणों की प्रणाली के संख्यात्मक समाधान जैसे रैखिक बीजगणित संचालन का समर्थन करते हैं, यहां तक ​​कि मूर-पेनरोज़ स्यूडोइनवर्स का उपयोग भी करते हैं।[7][8]

सरणियों के आंतरिक उत्पाद का नियाल उदाहरण मूल आव्यूह गुणन ऑपरेटर का उपयोग करके कार्यान्वित किया जा सकता है। यदि a आकार का पंक्ति सदिश है [1 एन] और b आकार [एन 1] का संगत कॉलम सदिश है।

ए * बी;

इसके विपरीत, प्रवेश-वार उत्पाद को इस प्रकार कार्यान्वित किया जाता है:

ए .* बी;

समान संख्या में तत्वों वाले दो आव्यूह के मध्य आंतरिक उत्पाद को सहायक ऑपरेटर के साथ कार्यान्वित किया जा सकता है (:), जो किसी दिए गए आव्यूह को कॉलम सदिश और खिसकाना ऑपरेटर को पुनः आकार देता है ':

ए(:)' * बी(:);

rasql

Rasdaman#Raster क्वेरी भाषा डेटाबेस-उन्मुख सरणी-प्रोग्रामिंग भाषा है। उदाहरण के लिए, निम्नलिखित क्वेरी के साथ दो सरणियाँ जोड़ी जा सकती हैं:

SELECT A + B
FROM   A, B

आर

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

> A <- matrix(1:6, nrow=2)                             # !!this has nrow=2 ... and A has 2 rows
> A
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6
> B <- t( matrix(6:1, nrow=2) )  # t() is a transpose operator                           !!this has nrow=2 ... and B has 3 rows --- a clear contradiction to the definition of A
> B
     [,1] [,2]
[1,]    6    5
[2,]    4    3
[3,]    2    1
> C <- A %*% B
> C
     [,1] [,2]
[1,]   28   19
[2,]   40   28
> D <- C + 1
> D
     [,1] [,2]
[1,]   29   20
[2,]   41   29
> D + c(1, 1)  # c() creates a vector
     [,1] [,2]
[1,]   30   21
[2,]   42   30

गणितीय तर्क और भाषा संकेतन

आव्यूह लेफ्ट-डिवीजन ऑपरेटर आव्यूह के कुछ अर्थ संबंधी गुणों को संक्षेप में व्यक्त करता है। जैसे कि अदिश समतुल्य में, यदि (निर्धारक) गुणांक (आव्यूह) A शून्य नहीं है तो (वेक्टोरियल) समीकरण को हल करना संभव है A * x = b के व्युत्क्रम आव्यूह द्वारा दोनों पक्षों को बाएँ-गुणा करके A: A−1 (MATLAB और जीएनयू ऑक्टेव दोनों भाषाओं में: A^-1). निम्नलिखित गणितीय कथन कब क्रियान्वित होते हैं A आव्यूह रैंक#गुण वर्ग आव्यूह है:

A^-1 *(A * x)==A^-1 * (b)
(A^-1 * A)* x ==A^-1 * b (आव्यूह-गुणा साहचर्य)
x = A^-1 * b

कहाँ == तुल्यता संबंधपरक ऑपरेटर है.

पिछले कथन भी वैध MATLAB अभिव्यक्ति हैं यदि तीसरे को दूसरों से पहले निष्पादित किया जाता है (राउंड-ऑफ त्रुटियों के कारण संख्यात्मक तुलना गलत हो सकती है)।

यदि सिस्टम अतिनिर्धारित है - तो वह A इसमें स्तंभों की तुलना में अधिक पंक्तियाँ हैं - छद्म व्युत्क्रम A+ (MATLAB और जीएनयू ऑक्टेव भाषाओं में: pinv(A)) व्युत्क्रम को प्रतिस्थापित कर सकता है A−1, निम्नलिखित नुसार:

pinv(A) *(A * x)==pinv(A) * (b)
(pinv(A) * A)* x ==pinv(A) * b (आव्यूह-गुणा साहचर्य)
x = pinv(A) * b

चूँकि, ये समाधान न तो सबसे संक्षिप्त हैं (उदाहरण के लिए अभी भी अतिनिर्धारित प्रणालियों को उल्लेखनीय रूप से भिन्न करने की आवश्यकता बनी हुई है) और न ही सबसे कम्प्यूटेशनल रूप से कुशल हैं। अदिश समतुल्य पर दोबारा विचार करने पर बाद वाला बिंदु समझना आसान है a * x = b, जिसके लिए समाधान x = a^-1 * b अधिक कुशल के अतिरिक्त दो ऑपरेशनों की आवश्यकता होगी x = b / a. समस्या यह है कि सामान्यतः आव्यूह गुणन क्रमविनिमेयता नहीं है जिससे कि आव्यूह मामले में अदिश समाधान के विस्तार के लिए आवश्यकता होगी:

(a * x)/ a ==b / a
(x * a)/ a ==b / a (मैट्रिसेस के लिए क्रमपरिवर्तनशीलता मान्य नहीं है!)
x * (a / a)==b / a (साहचर्य आव्यूह के लिए भी क्रियान्वित होता है)
x = b / a

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

A \ (A * x)==A \ b
(A \ A)* x ==A \ b (सहयोगिता आव्यूहों के लिए भी मान्य है, क्रमविनिमेयता की अब आवश्यकता नहीं है)
x = A \ b

यह न केवल कोडिंग के दृष्टिकोण से बल्कि कम्प्यूटेशनल दक्षता परिप्रेक्ष्य से संक्षिप्त सरणी प्रोग्रामिंग का उदाहरण है, जो अनेक सरणी प्रोग्रामिंग भाषाओं में अधिक कुशल रैखिक बीजगणित पुस्तकालयों जैसे स्वचालित रूप से ट्यून किए गए रैखिक बीजगणित सॉफ्टवेयर या LAPACK से लाभ उठाता है।[9]

इवरसन के पिछले उद्धरण पर लौटते हुए, इसके पीछे का तर्क अब स्पष्ट होना चाहिए:

it is important to distinguish the difficulty of describing and of learning a piece of notation from the difficulty of mastering its implications. For example, learning the rules for computing a matrix product is easy, but a mastery of its implications (such as its associativity, its distributivity over addition, and its ability to represent linear functions and geometric operations) is a different and much more difficult matter. Indeed, the very suggestiveness of a notation may make it seem harder to learn because of the many properties it suggests for explorations.

तृतीय-पक्ष लाइब्रेरी

अधिक संक्षिप्त सार-संक्षेप प्रदान करने के लिए विशिष्ट और कुशल पुस्तकालयों का उपयोग अन्य प्रोग्रामिंग भाषाओं में भी आम है। C++ में अनेक रैखिक बीजगणित पुस्तकालय भाषा की ऑपरेटर ओवरलोडिंग की क्षमता का फायदा उठाते हैं। कुछ स्थितियों में उन भाषाओं में बहुत ही संक्षिप्त अमूर्तता स्पष्ट रूप से सरणी प्रोग्रामिंग प्रतिमान से प्रभावित होती है, जैसे कि NumPy एक्सटेंशन लाइब्रेरी से Python (प्रोग्रामिंग भाषा), आर्माडिलो (C++ लाइब्रेरी) और ब्लिट्ज़++ लाइब्रेरीज़ ऐसा करती हैं।[10][11]

यह भी देखें

  • सारणी काटना
  • प्रकार के अनुसार प्रोग्रामिंग भाषाओं की सूची#सरणी भाषाएँ

संदर्भ

  1. Stéfan van der Walt; S. Chris Colbert & Gaël Varoquaux (2011). "The NumPy array: a structure for efficient numerical computation". Computing in Science and Engineering. IEEE. 13 (2): 22–30. arXiv:1102.1523. Bibcode:2011CSE....13b..22V. doi:10.1109/mcse.2011.37. S2CID 16907816.
  2. Iverson, K. E. (1980). "विचार के एक उपकरण के रूप में संकेतन।". Communications of the ACM. 23 (8): 444–465. doi:10.1145/358896.358899.
  3. Surana P (2006). भाषा सार का मेटा-संकलन। (Thesis).
  4. Kuketayev. "जावा में छोटी वस्तुओं के लिए डेटा एब्स्ट्रैक्शन पेनल्टी (डीएपी) बेंचमार्क।". Archived from the original on 2009-01-11. Retrieved 2008-03-17.
  5. Chatzigeorgiou; Stephanides (2002). "Evaluating Performance and Power Of Object-Oriented Vs. Procedural Programming Languages". In Blieberger; Strohmeier (eds.). Proceedings - 7th International Conference on Reliable Software Technologies - Ada-Europe'2002. Springer. p. 367. ISBN 978-3-540-43784-0.
  6. Ada Reference Manual: G.3.1 Real Vectors and Matrices
  7. "जीएनयू ऑक्टेव मैनुअल। अंकगणितीय आपरेटर।". Retrieved 2011-03-19.
  8. "मैटलैब दस्तावेज़ीकरण। अंकगणितीय आपरेटर।". Retrieved 2011-03-19.
  9. "जीएनयू ऑक्टेव मैनुअल। परिशिष्ट जी ऑक्टेव स्थापित करना।". Retrieved 2011-03-19.
  10. "Reference for Armadillo 1.1.8. Examples of Matlab/Octave syntax and conceptually corresponding Armadillo syntax". Retrieved 2011-03-19.
  11. "Blitz++ User's Guide. 3. Array Expressions". Archived from the original on 2011-03-23. Retrieved 2011-03-19.


बाहरी संबंध