Matlab में वैरिएबल के रूप में i और j का उपयोग करना


142

iऔर jबहुत लोकप्रिय चर नाम हैं (उदाहरण के लिए, यह सवाल और यह एक )।

उदाहरण के लिए, लूप में:

for i=1:10,
    % do something...
end

मैट्रिक्स में सूचकांक के रूप में:

mat( i, j ) = 4;

उन्हें मतलाब में चर नामों के रूप में क्यों नहीं इस्तेमाल किया जाना चाहिए ?


5
बेशक, मैं इसे इस तरह से नहीं लूँगा, लेकिन जवाबों से मैं यह कहूंगा कि यह "मुख्य रूप से राय-आधारित" है। ;-) मैं व्यक्तिगत रूप से पर छोड़ देना नहीं होता i, j, kसामान्य पाश चर नाम के रूप में।
ए। डोंडा

1
@ ए। डोंडा, यह आपकी राय है;)
शाी

@ शाई, यह इस प्रश्न में आपका अंतिम वाक्य है: "उन्हें मतलाब में परिवर्तनशील नामों के रूप में क्यों नहीं इस्तेमाल किया जाना चाहिए?" तो यह बहुत अस्पष्ट है कि आप अपने प्रश्न पर मेरे संस्करण को अस्वीकार क्यों करते हैं ?! मैंने आपका शीर्षक और अधिक रचनात्मक शीर्षक में बदल दिया "क्यों मैं मतलूब में वैरिएबल के रूप में i और j का उपयोग नहीं करना चाहिए"
Seyfi

जवाबों:


176

क्योंकि iऔर jदोनों कार्य काल्पनिक इकाई को दर्शाते हैं :

तो एक चर कहा जाता है iया jउन्हें ओवरराइड करेगा, संभवतः जटिल गणित को चुपचाप तोड़ने वाला कोड।

संभावित समाधानों में शामिल हैं iiऔर jjलूप वेरिएबल्स के बजाय या 1iजब भी iकाल्पनिक इकाई का प्रतिनिधित्व करने के लिए उपयोग करना आवश्यक है।


42
यह भी ध्यान देने योग्य है कि भले ही आप कुछ भी नहीं तोड़ रहे हों, फिर भी चर iऔर jचर नामों को हल करने के लिए निष्पादन समय का त्याग किया जाता है ।
Eitan T

14
@ ईटान: क्या आप वास्तव में मैटलैब के जेआईटी संकलित संस्करण में किसी भी ठोस निर्णायक तरीके से वापस आ सकते हैं? मैंने कभी भी ऐसा नहीं पाया है (और for1 बिलियन बार लूप कॉलिंग करने वाले सरल परीक्षण समय में कोई सांख्यिकीय अंतर नहीं दिखाते हैं)। हम सभी जानते हैं कि वास्तव में इसे संभालने के लिए iऔर j(और k?) के अलावा अन्य चर का उपयोग करने के लिए विशेष कोड है, वास्तव में थोड़ा धीमा है। और जो अंतर मौजूद हैं, वे वास्तविक जीवन में गैर-मौजूद हैं। बस उपयोग करने का कोई कारण नहीं है iऔर jनियमित रूप से चर के रूप में-बस उन्हें किसी भी अन्य माटलाब फ़ंक्शन की तरह ठीक से उपयोग करना होगा।
21 दिसंबर को हॉरलर

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

14
मतलाब के प्राचीन संस्करणों में हो सकता है। मैं खुद वह देखता था। लेकिन कम से कम R2012a + (OS X) के साथ और अधिक नहीं। और for1 बिलियन बार लूप कॉल करने और सभी तरह की टाइमिंग स्कीमों को आजमाने पर मुझे कोई फर्क नहीं पड़ा । मैं नए SO उपयोगकर्ताओं को देख रहा हूँ कि उन्हें पूरी तरह से मान्य कोड गलत बताया जा रहा है क्योंकि वे उपयोग कर रहे हैं iऔर jलूप्स को पुनरावृत्त करना चाहते हैं। सच कहूँ तो यह सिर्फ मूर्खतापूर्ण है और लोग इस प्रश्न के अधिक महत्वपूर्ण बिंदु को याद कर रहे हैं: iऔर jअगर काल्पनिक पठनीय माटलब कोड लिखना चाहते हैं तो उसे काल्पनिक इकाई के लिए भी इस्तेमाल नहीं किया जाना चाहिए।
horchler

12
मेरा प्रमुख समय बचाना है जब ii की खोज करना। मैं खोज रहा हूँ एक असली दर्द हो सकता है
सनक

62

बचने के लिए iऔर jचर के बारे में भ्रम से बचने के लिए अच्छा अभ्यास है कि वे चर या काल्पनिक इकाई हो।

व्यक्तिगत रूप से, हालांकि, मैं का उपयोग करें iऔर jचर के रूप में अक्सर के रूप में कम छोरों के सूचकांक। अपने स्वयं के कोड में समस्याओं से बचने के लिए, मैं एक और अच्छे अभ्यास का पालन करता हूं : iऔर काल्पनिक संख्याओं को दर्शाने के लिए उनका उपयोग नहीं करते हैं। वास्तव में, मतलाब के अपने दस्तावेज में कहा गया है :j

गति और बेहतर मजबूती के लिए, आप जटिल iऔर jद्वारा प्रतिस्थापित कर सकते हैं 1i

इसलिए संभावित संघर्ष के कारण दो बहुत ही आमतौर पर उपयोग किए जाने वाले चर नामों से बचने के बजाय, मैं काल्पनिक संख्याओं के बारे में स्पष्ट हूं। यह मेरे कोड को और अधिक स्पष्ट करता है। जब भी मैं देखता हूं 1i, मुझे पता है कि यह प्रतिनिधित्व करता है sqrt(-1)क्योंकि यह संभवतः एक चर नहीं हो सकता है।


2
यह वास्तव में उपयोग करने के लिए अच्छा अभ्यास है 1i। हालाँकि, इसका अर्थ बदलने iऔर इसj तरह के रूप में हार्ड-टू-डीबग त्रुटियां हो सकती हैं ।
Shai

1
@ शाई गुड पॉइंट। मुझे लगता है कि परहेज स्वीकार करने के लिए मेरा उत्तर बदलाव iऔर jसबसे अच्छा है, लेकिन बताया कि कैसे मेरी निजी कोडिंग शैली है कि नियम का पालन नहीं करता है।
शॉइलर

2
ध्यान दें कि जिस गति का उल्लेख किया गया है वह बहुत महत्वपूर्ण नहीं लगती है: stackoverflow.com/questions/18163454/…
डेनिस जहरुद्दीन

पूर्णतया सहमत! अच्छा अभ्यास ALWAYS का उपयोग करना है 1iiकि जटिल गणित के लिए। के रूप में काल्पनिक संख्या का सोचते हैं 1iऔर लेने के iकाल्पनिक संख्या के रूप में एक बुरा व्यवहार। कोई और रास्ता नही। का उपयोग करते हुएi , ii, iiiमैटलैब में आम बात है और वहाँ कोई समस्या नहीं है, जब लोग पर कायम है 1iऔर 1jजटिल संख्या के लिए। मैटलैब भी इसका सम्मान करते हैं और पिछले उत्तर में बताए अनुसार यह प्रदर्शन में कमी नहीं करता (जहाँ तक मैंने परीक्षण किया)।
SdidS

i और j का उपयोग वैसे भी नहीं किया जाना चाहिए - उन संख्याओं का अर्थ कुछ है - एक नाम का उपयोग करें जो उद्देश्य (row_n, elementNo, listItemIndex, आदि) का वर्णन करता है। तो बहुत आसान है किसी को तुम क्या कर रहे, डिबग करने के लिए, आदि को समझने के लिए अतिरिक्त समय बिताया एक थ्रो-दूर स्क्रिप्ट से ज्यादा कुछ के लिए लंबी अवधि के रख-रखाव में लाभ के लायक से अधिक है - यहां तक कि मैटलैब संपादक अच्छी तरह से पीछे होने के साथ अधिकांश अन्य आधुनिक आई.डी.ई.
लाइटसीसी

27

MATLAB के पुराने संस्करणों में, वहाँ के उपयोग से बचने के लिए एक अच्छा कारण हुआ करता था iऔर jचर नाम के रूप में - MATLAB JIT के प्रारंभिक संस्करणों चालाक पर्याप्त बताओ कि क्या आप उन्हें चर के रूप में या काल्पनिक इकाइयों के रूप में उपयोग कर रहे थे इसलिए नहीं थे, और होगा कई अन्यथा संभव अनुकूलन बंद करें।

आपका कोड इसलिए बस की बहुत उपस्थिति से धीमी मिलेगा iऔर jचर के रूप में, और तेजी लाने के अगर तुम उन्हें कुछ और करने के लिए बदल जाएगा। इसीलिए, यदि आप बहुत से MathWorks कोड पढ़ते हैं, तो आप लूप इंडेक्स के रूप में काफी व्यापक रूप से देखेंगे iiऔर jjइस्तेमाल करेंगे। कुछ समय के लिए, MathWorks ने अनौपचारिक रूप से लोगों को यह करने की सलाह दी हो सकती है कि वे स्वयं (हालाँकि वे हमेशा आधिकारिक तौर पर लोगों को सलाह देते हैं कि वे वर्तमान JIT जो भी करते हैं, उसके बजाय लालित्य / अनुरक्षण के लिए कार्यक्रम करें क्योंकि यह प्रत्येक संस्करण का एक लक्ष्य है)।

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

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

दूसरी ओर, अपने विशिष्ट काम में मैं कभी भी जटिल संख्या से निपटता नहीं हूं, और मुझे अपने कोड को अधिक पठनीय लगता है अगर मैं उपयोग करने के लिए स्वतंत्र महसूस करता हूं iऔर jलूप इंडेक्स के रूप में।


मुझे यहाँ बहुत सारे उत्तर दिखाई देते हैं जो कहते हैं कि यह अनुशंसित नहीं है ... यह कहे बिना कि कौन अनुशंसा कर रहा है। यहाँ वर्तमान रिलीज़ दस्तावेज़ से MathWorks की वास्तविक सिफारिशों की सीमा है i:

चूंकि मैं एक फ़ंक्शन है, इसलिए इसे ओवरराइड किया जा सकता है और एक चर के रूप में उपयोग किया जा सकता है। हालांकि, अगर आप उन्हें जटिल अंकगणित में उपयोग करने का इरादा रखते हैं, तो चर नामों के लिए i और j के उपयोग से बचना सबसे अच्छा है। [...] गति और बेहतर मजबूती के लिए, आप 1i द्वारा जटिल i और j को बदल सकते हैं।


15

जैसा कि अन्य उत्तरों में वर्णित है, iसामान्य कोड का उपयोग दो कारणों से अनुशंसित नहीं है:

  • यदि आप काल्पनिक संख्या का उपयोग करना चाहते हैं, तो यह एक सूचकांक के साथ भ्रमित या अधिलेखित हो सकता है
  • यदि आप इसे एक सूचकांक के रूप में उपयोग करते हैं तो यह काल्पनिक संख्या से अधिक हो सकता है या भ्रमित हो सकता है

जैसा कि सुझाव दिया गया है: 1iऔर iiअनुशंसित हैं। हालांकि, हालांकि ये दोनों ठीक विचलन हैं, लेकिन इन दोनों iविकल्पों का एक साथ उपयोग करना बहुत अच्छा नहीं है।

यहाँ एक उदाहरण है कि क्यों (व्यक्तिगत रूप से) मुझे यह पसंद नहीं है:

val2 = val + i  % 1
val2 = val + ii % 2
val2 = val + 1i % 3

एक आसानी से दो या तीन के लिए गलत नहीं होगा, लेकिन दो और तीन प्रत्येक अभिषेक से मिलते जुलते हैं।

इसके अलावा मेरी व्यक्तिगत सिफारिश होगी: यदि आप कभी-कभी जटिल कोड के साथ काम करते हैं तो हमेशा 1iएक अलग लूप चर के साथ संयुक्त का उपयोग करें ।

एकल अक्षर सूचकांक के उदाहरण है कि अगर आप कई पाश चर और पत्र पर्याप्त उपयोग नहीं करते के लिए: t, u, kऔरp

लंबे समय तक सूचकांकों का उदाहरण: i_loop, step, walk, औरt_now

बेशक यह व्यक्तिगत स्वाद का मामला है, लेकिन लंबे समय तक बढ़ने के बिना स्पष्ट अर्थों का उपयोग करने के लिए सूचक ढूंढना कठिन नहीं होना चाहिए।


1
1i काल्पनिक इकाई को दर्शाता है (मतलब चर नाम भी संख्या से शुरू नहीं हो सकता है)
lib

2
@DennisJaheruddin: बेशर्म प्लग: उपयोग मेरी MATLAB वाक्य रचना हाइलाइटिंग userscript स्टैक ओवरफ़्लो के लिए। अंतिम उदाहरण में, 1iएक नंबर के रूप में अलग-अलग रंग का होगा :)
अमरो

2
सीधे doc iऔर doc j: "गति और बेहतर मजबूती के लिए, आप जटिल आई और जे को 1i से बदल सकते हैं।" IMO, वर्तमान मतलाब में उपयोग नहीं करने iऔर jलूप्स आदि में, या 1iकाल्पनिक इकाई को निरूपित करने के अलावा किसी अन्य चीज का उपयोग करने का कोई कारण नहीं है 1j। एकमात्र अपवाद तब होता है जब हमेशा-थोड़ा-असंगत प्रतीकात्मक इंजन के तार गुजरते हैं। अजीब बात है help 1iऔर doc 1iहालांकि काम नहीं करते।
हॉरर

11

यह बताया गया कि 1iयह लिखने का एक स्वीकार्य और असंदिग्ध तरीका है sqrt(-1), और इस तरह से उपयोग करने से बचने की कोई आवश्यकता नहीं है i। फिर, के रूप में डेनिस ने बताया ( https://stackoverflow.com/a/14893729/1967396 ), यह मुश्किल के बीच अंतर को देखने के लिए किया जा सकता है 1iऔर ii। मेरा सुझाव: 1jजहां संभव हो काल्पनिक स्थिरांक के रूप में उपयोग करें । यह वही चाल है जो इलेक्ट्रिकल इंजीनियर नियोजित करते हैं - वे उपयोग jकरते हैं sqrt(-1)क्योंकि iपहले से ही वर्तमान के लिए लिया जाता है ।

व्यक्तिगत रूप से मैं कभी उपयोग नहीं करता हूं iऔर j; मैं का उपयोग करें iiऔर jjआशुलिपि अनुक्रमण चर, (और केके, डालूँगा, मिमी, ...) और के रूप में 1jजब मैं जटिल नंबरों का उपयोग करने की जरूरत है।


2
"यह बीच का अंतर देखने के लिए मुश्किल हो सकता है 1iऔर iiऔर भी अधिक के बीच अंतर" 1और lऔर के बीच Oऔर 0। यही कारण है कि मैं एक नए MATALB इंस्टालेशन में पहला कदम डिफ़ॉल्ट फॉन्ट साइज़ को बदल रहा हूँ।
ग्लोगल

6

काल्पनिक इकाई के साथ भ्रम यहाँ अच्छी तरह से कवर किया गया है, लेकिन कुछ अन्य अधिक कारण हैं कि क्यों इन और अन्य एकल-पत्र चर नामों को कभी-कभी हतोत्साहित किया जाता है।

  1. MATLAB विशेष रूप से: यदि आप अपने MATLAB कोड से C ++ स्रोत उत्पन्न करने के लिए कोडर का उपयोग कर रहे हैं (नहीं, यह भयानक है) तो आपको संभावित टाइपिंग क्लैश के कारण चर का पुन: उपयोग न करने की स्पष्ट चेतावनी दी जाती है।

  2. आम तौर पर, और आपके आईडीई के आधार पर, एक एकल-अक्षर चर नाम हाइलाइटर्स और खोज / प्रतिस्थापन के साथ कहर पैदा कर सकता है। MATLAB इससे ग्रस्त नहीं है और मेरा मानना ​​है कि विजुअल स्टूडियो को कुछ समय के लिए कोई समस्या नहीं हुई है, लेकिन CIS / C ++ कोडिंग मानकों जैसे MISRA आदि उन्हें फिर से सलाह देने की प्रवृत्ति रखते हैं।

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


4

किसी भी गैर-तुच्छ कोड में कई forलूप होते हैं, और सर्वोत्तम अभ्यास आपको सलाह देते हैं कि आप इसके उद्देश्य और कार्यक्षेत्र के सूचक नाम का उपयोग करें। अनादिकाल के लिए (और जब तक इसकी 5-10 पंक्तियों की स्क्रिप्ट जिसे मैं सहेजने वाला नहीं हूं), मैं हमेशा चर नाम का उपयोग करता रहा हूं idxTask, idxAnotherTaskऔर idxSubTaskआदि।

या फिर बहुत कम सरणी यह जैसे को अनुक्रमित करता है के पहले अक्षर को दोगुना करने में ssसूचकांक के लिए subjectList, ttसूचकांक करने के लिए taskList, लेकिन नहीं iiया jjजो मुझे अनायास जो सरणी वे छोरों के लिए अपने एक से अधिक से बाहर का अनुक्रमण कर रहे हैं की पहचान में मदद नहीं करता है।


3

डिफ़ॉल्ट रूप से iऔर jकाल्पनिक इकाई के लिए खड़े रहें। तो MATLAB के दृष्टिकोण से, iएक चर के रूप में उपयोग करना किसी तरह 1से एक चर के रूप में उपयोग करना है।


5
मुझे नहीं लगता कि यह ऐसा है। मैं एक कानूनी चर नाम है, इसलिए आप वास्तव में i और j का उपयोग चर नामों के रूप में कर सकते हैं। यह पिछले उत्तर के रूप में उल्लेख करेगा, काल्पनिक अर्थ का मुखौटा। 1 एक वैध चर नाम नहीं है। यदि आप कभी जटिल संख्या का उपयोग नहीं करते हैं तो यह पूरी तरह से ठीक है।
थांग

@ थांग इसीलिए मैंने कहा "किसी तरह" और "नहीं" की तरह। मुझे पता है कि इसमें अंतर है। ओपी ने पूछा कि उनका उपयोग क्यों नहीं किया जाना चाहिए, मैंने यह समझाने की कोशिश की कि यह इसलिए है क्योंकि वे पहले से ही एक संख्या व्यक्त करते हैं।
यो '

2
ठीक है, माफ करना, मुझे नहीं पता कि किसी तरह क्या मतलब है। मेरे लिए यह स्पष्ट रूप से अलग है क्योंकि अच्छी तरह से, आप 1 को एक चर के रूप में उपयोग नहीं कर सकते हैं भले ही आप चाहते थे ... लेकिन मैं देख रहा हूं कि आप कहां से आ रहे हैं।
थांग

आप उनका उपयोग कर सकते हैं, क्योंकि आप चर के लिए मौजूदा फ़ंक्शन नाम का उपयोग कर सकते हैं (और साथ ही उन अंतर्निहित कार्यों / स्थिरांक को आगे उपयोग के लिए दूषित कर सकते हैं)। आप वास्तव में चाहते हैं कि एक और बात है (imo सरल जवाब: नहीं)
Gunther Struyf

1
क्षमा करें, लेकिन इस स्पष्टीकरण का कोई मतलब नहीं है। iऔर jवास्तव में काल्पनिक इकाई के मूल्य लौटने कार्य हैं। किसी कार्यक्षेत्र में समान नाम के साथ एक चर का उपयोग करना संभव है। हालांकि यह फ़ंक्शन को छाया देगा।
पेट

2

जब तक आप एक बहुत भ्रमित उपयोगकर्ता नहीं हैं मुझे लगता है कि चर नाम i और j का उपयोग करने में बहुत कम जोखिम है और मैं उन्हें नियमित रूप से उपयोग करता हूं। मैंने कोई आधिकारिक संकेत नहीं देखा है कि इस अभ्यास से बचा जाना चाहिए।

हालांकि यह सच है कि काल्पनिक इकाई को छायांकित करना किसी संदर्भ में कुछ भ्रम पैदा कर सकता है जैसा कि अन्य पदों में उल्लेख किया गया है, कुल मिलाकर मैं इसे केवल एक प्रमुख मुद्दे के रूप में नहीं देखता हूं। MATLAB में और भी बहुत सी भ्रमित करने वाली चीजें हैं, उदाहरण के लिए परिभाषित करेंfalse=true

मेरी राय में केवल समय शायद आपको उनसे बचना चाहिए, यदि आपका कोड विशेष रूप से काल्पनिक संख्याओं से संबंधित है।


क्या आप कृपया मतदान के बाद नीचे टिप्पणी कर सकते हैं। उदाहरण के लिए मैथवर्क्स लिंक के साथ यह दर्शाता है कि अभ्यास की सिफारिश नहीं की गई है (जो कि किसी आधिकारिक दिशानिर्देश का संदर्भ दिए बिना कई पोस्टरों द्वारा कहा गया है)। वास्तव में लूप्स में 'i' का उपयोग आधिकारिक उदाहरणों में Mathworks द्वारा किया जा रहा है। मेरे अनुभव में यह कोड को स्पष्ट और संक्षिप्त बनाता है और बहुत ही सामान्य अभ्यास है।
gregswiss

1
हवाला देते हुए प्रलेखन "जब से iएक समारोह है, यह अधिरोहित और एक चर के रूप में इस्तेमाल किया जा सकता। हालांकि, यह सबसे अच्छा उपयोग करने से बचें है iऔर jचर नाम के लिए यदि आप उन्हें जटिल गणित में उपयोग करना चाहते हैं।" ऑलिवर के उत्तर पर एतान टी द्वारा टिप्पणी के साथ संयोजन के रूप में, (मुझे लगता है कि उन्होंने इसे समयबद्ध किया है) पर्याप्त प्रमाण लगता है।
एड्रियन

1
यह भी ध्यान दें कि @ Adriaan द्वारा उल्लिखित टिप्पणी के साथ 2013 से पहले से ही एक उत्तर है
एंड्रास डीक

1
इसलिए दस्तावेज़ में कहा गया है कि यदि आप जटिल अंकगणित में उपयोग करने का इरादा रखते हैं, अन्यथा यह लागू नहीं होता - पता नहीं क्यों हर कोई यहाँ के बारे में इतना उधम मचाता है! मैं केवल एक वैकल्पिक दृष्टिकोण प्रस्तुत कर रहा था।
gregswiss
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.