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

From Vigyanwiki
No edit summary
No edit summary
Line 8: Line 8:
सरणी प्रोग्रामिंग के पीछे मूल विचार यह है कि ऑपरेशन मानों के पूर्ण समूह पर क्रियान्वित होते हैं। यह इसे उच्च-स्तरीय प्रोग्रामिंग मॉडल बनाता है जिससे कि यह प्रोग्रामर को व्यक्तिगत स्केलर संचालन के स्पष्ट लूप का सहारा लिए बिना, डेटा के पूर्ण समुच्चय पर सोचने और संचालित करने की अनुमति देता है।
सरणी प्रोग्रामिंग के पीछे मूल विचार यह है कि ऑपरेशन मानों के पूर्ण समूह पर क्रियान्वित होते हैं। यह इसे उच्च-स्तरीय प्रोग्रामिंग मॉडल बनाता है जिससे कि यह प्रोग्रामर को व्यक्तिगत स्केलर संचालन के स्पष्ट लूप का सहारा लिए बिना, डेटा के पूर्ण समुच्चय पर सोचने और संचालित करने की अनुमति देता है।


केनेथ ई. इवरसन ने ऐरे प्रोग्रामिंग (वास्तव में एपीएल का संदर्भ देते हुए) के पीछे के तर्क का वर्णन इस प्रकार किया है।<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>
{{quote|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.
{{quote|अधिकांश प्रोग्रामिंग भाषाएं निश्चित रूप से गणितीय संकेतन से कमतर हैं और विचार के उपकरण के रूप में उनका बहुत कम उपयोग किया जाता है, जिसे एक व्यावहारिक गणितज्ञ द्वारा महत्वपूर्ण माना जा सकता है।
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 आयाम से संक्षिप्त कर देता है।
गणित में [[ टेन्सर |टेन्सर]] रैंक के अनुरूप, सामान्य रूप से प्रोग्रामिंग भाषाओं को व्यवस्थित करने के लिए [[फ़ंक्शन रैंक|फलन रैंक]] महत्वपूर्ण अवधारणा है: डेटा पर काम करने वाले फलन को उन आयामों की संख्या के आधार पर वर्गीकृत किया जा सकता है जिन पर वे कार्य करते हैं। उदाहरण के लिए, साधारण गुणन अदिश रैंक वाला फलन है जिससे कि यह शून्य-आयामी डेटा (व्यक्तिगत संख्या) पर काम करता है। [[ पार उत्पाद |पार उत्पाद]] ऑपरेशन सदिश रैंक फलन का उदाहरण है जिससे कि यह वैक्टर पर काम करता है, स्केलर पर नहीं। इस प्रकार [[मैट्रिक्स गुणन|आव्यूह गुणन]] 2-रैंक फलन का उदाहरण है, जिससे कि यह 2-आयामी वस्तुओं (मैट्रिसेस) पर काम करता है। [[कम करें (उच्च-क्रम फ़ंक्शन)|कम करें (उच्च-क्रम फलन)]] इनपुट डेटा सरणी की आयामीता को या अधिक आयामों से कम करें। उदाहरण के लिए, तत्वों का योग इनपुट सरणी को 1 आयाम से संक्षिप्त कर देता है।


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


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


===अदिश भाषाएँ===
===अदिश भाषाएँ===
Line 256: 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 262: 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]] एक्सटेंशन लाइब्रेरी से पायथन (प्रोग्रामिंग भाषा), [[आर्माडिलो (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 17:31, 2 July 2023

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

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

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

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

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

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

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

दरअसल, किसी नोटेशन की बहुत ही सुझावात्मकता इसे सीखना कठिन बना सकती है क्योंकि यह अन्वेषणों के लिए कई गुणों का सुझाव देता है।

[...]

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

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

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

उपयोग

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

भाषाएँ

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

अदिश भाषाएँ

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

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

यह न केवल कोडिंग के दृष्टिकोण से बल्कि कम्प्यूटेशनल दक्षता परिप्रेक्ष्य से संक्षिप्त सरणी प्रोग्रामिंग का उदाहरण है, जो अनेक सरणी प्रोग्रामिंग भाषाओं में अधिक कुशल रैखिक बीजगणित पुस्तकालयों जैसे स्वचालित रूप से ट्यून किए गए रैखिक बीजगणित सॉफ्टवेयर या लैपैक से लाभ उठाता है।[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 एक्सटेंशन लाइब्रेरी से पायथन (प्रोग्रामिंग भाषा), आर्माडिलो (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.


बाहरी संबंध