MATLAB में एक फॉर्च्यूनर है? यदि हां, तो अंतर्निहित डेटा में परिवर्तन होने पर यह कैसे व्यवहार करता है?


170

MATLAB में एक फोरचेक संरचना है? यदि ऐसा है, तो क्या होता है यदि अंतर्निहित डेटा में बदलाव होता है (अर्थात यदि ऑब्जेक्ट सेट में जोड़े जाते हैं)?

जवाबों:


146

MATLAB के लिए पाश प्रकृति में स्थिर है; आप अन्य भाषाओं में (संरचना ; वृद्धिशील) लूप संरचना के विपरीत, पुनरावृत्तियों के बीच लूप चर को संशोधित नहीं कर सकते । इसका मतलब यह है कि निम्नलिखित कोड हमेशा 1, 2, 3, 4, 5 प्रिंट करता है, भले ही बी के मूल्य की परवाह किए बिना।

A = 1:5;

for i = A
    A = B;
    disp(i);
end

यदि आप पुनरावृत्तियों के दौरान डेटा संरचना में परिवर्तनों का जवाब देने में सक्षम होना चाहते हैं, तो एक WHILE लूप अधिक उपयुक्त हो सकता है --- आप लूप की स्थिति का हर पुनरावृत्ति पर परीक्षण कर पाएंगे, और लूप वेरिएबल का मान सेट कर पाएंगे ( एस) जैसा आप चाहते हैं:

n = 10;
f = n;
while n > 1
    n = n-1;
    f = f*n;
end
disp(['n! = ' num2str(f)])

Btw, जावा (और संभवतः अन्य भाषाओं) में प्रत्येक लूप के लिए डेटा संरचना को पुनरावृत्ति के दौरान संशोधित करने पर अनिर्दिष्ट व्यवहार उत्पन्न करता है। यदि आपको डेटा संरचना को संशोधित करने की आवश्यकता है, तो आपको एक उपयुक्त Iterator आवृत्ति का उपयोग करना चाहिए जो उस संग्रह में तत्वों को जोड़ने और हटाने की अनुमति देता है जो आप पुनरावृत्त कर रहे हैं। अच्छी खबर यह है कि MATLAB जावा ऑब्जेक्ट्स का समर्थन करता है, इसलिए आप ऐसा कुछ कर सकते हैं:

A = java.util.ArrayList();
A.add(1);
A.add(2);
A.add(3);
A.add(4);
A.add(5);

itr = A.listIterator();

while itr.hasNext()

    k = itr.next();
    disp(k);

    % modify data structure while iterating
    itr.remove();
    itr.add(k);

end

1
यदि B अपरिभाषित है, तो आपका पहला उदाहरण 1-5 प्रिंट नहीं करता है। यह प्रिंट करता है Undefined function or variable 'B'
क्लेस्ट

3
1 उदाहरण के लिए सुनिश्चित करें कि Aएक पंक्ति वेक्टर है, न कि कॉलम वेक्टर। यदि Aएक मैट्रिक्स है, तो प्रत्येक k उस मैट्रिक्स से एक कॉलम वेक्टर होगा। इसलिए, यदि आवश्यक हो तो स्थानांतरण ( A') या वेक्टराइज़ ( A(:)') करें।
युक

3
-1 मुझे नहीं लगता कि .mफाइलों में मतलाब के साथ काम करने के लिए जावा जैसा कोड आपकी पहली पसंद होना चाहिए ।
बोब्बोबो

1
भविष्य की शुभकामनाएं; हम itter अमान्य समस्या के समाधान के बहुत से आते हैं।
दिमित्री

89

Zach सवाल के सीधे जवाब के बारे में सही है।

एक दिलचस्प पक्ष यह है कि निम्नलिखित दो लूप एक ही निष्पादित नहीं करते हैं:

for i=1:10000
  % do something
end
for i=[1:10000]
  % do something
end

पहला लूप एक वैरिएबल बनाता है iजो एक स्केलर होता है और इसे लूप के लिए C की तरह iterates करता है। ध्यान दें कि यदि आप iलूप बॉडी में संशोधित करते हैं, तो संशोधित मूल्य को अनदेखा कर दिया जाएगा, जैसा कि Zach कहता है। दूसरे मामले में, माटलैब 10k- तत्व सरणी बनाता है, फिर यह सरणी के सभी तत्वों को चलाता है।

इसका मतलब क्या है

for i=1:inf
  % do something
end

काम करता है, लेकिन

for i=[1:inf]
  % do something
end

नहीं करता है (क्योंकि इस एक को अनंत स्मृति आवंटित करने की आवश्यकता होगी)। देखें लोरेन के ब्लॉग जानकारी के लिए।

यह भी ध्यान दें कि आप सेल सरणियों पर पुनरावृति कर सकते हैं।


2
हाँ, मैं इस बारे में हैरान था जब मैं उसमें भाग गया। सरणियों का यह अनुकूलन वास्तव में कई स्थानों पर होता है। यदि आप ब्रैकेट संकेतन का उपयोग करते हैं, तो कभी-कभी आपको माटलाब संपादक में प्रदर्शन की चेतावनी देते हुए कहेंगे कि यह आपको लगता है कि यदि आप इसे करते हैं तो यह सरणी आवंटन को अनुकूलित कर सकता है।
श्री फूज

मुझे लगता है कि मतलाब के पास अब आलसी मूल्यांकन है। यदि नहीं, तो हमारे पास उन्हें लागू करने की तकनीक नहीं है।
दिमित्री

19

लूप के लिए MATLAB मूल रूप से सहित विशाल लचीलेपन की अनुमति देता हैकार्यक्षमता। यहाँ कुछ उदाहरण हैं:

1) प्रारंभ, वेतन वृद्धि और अंत सूचकांक को परिभाषित करें

for test = 1:3:9
   test
end

2) वेक्टर पर लूप

for test = [1, 3, 4]
   test
end

3) स्ट्रिंग पर लूप

for test = 'hello'
   test
end

4) एक आयामी सेल सरणी पर लूप

for test = {'hello', 42, datestr(now) ,1:3}
   test
end

5) एक दो आयामी सेल सरणी पर लूप

for test = {'hello',42,datestr(now) ; 'world',43,datestr(now+1)}
   test(1)   
   test(2)
   disp('---')
end

6) संरचना सरणियों के फील्डनाम का उपयोग करें

s.a = 1:3 ; s.b = 10  ; 
for test = fieldnames(s)'
   s.(cell2mat(test))
end

4
सेल सरणी के साथ, ध्यान दें कि यह सेल सरणी के स्तंभों पर पुनरावृति करेगा ।
इवगेनी सर्गेव

17

यदि आप सेल सरणी पर लूप करने की कोशिश कर रहे हैं और सेल में प्रत्येक तत्व पर कुछ लागू करते हैं, तो देखें cellfun। वहाँ भी है arrayfun, bsxfunऔर structfunजो आपके कार्यक्रम को सरल बना सकता है।


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

14

उह! साफ सवाल।

Matlab for loop इनपुट के रूप में एक मैट्रिक्स लेता है और इसके स्तंभों पर पुनरावृत्त करता है। मतलाब भी व्यावहारिक रूप से सब कुछ मूल्य (कोई पास-बाय-संदर्भ) से संभालता है, इसलिए मैं उम्मीद करूंगा कि यह लूप के इनपुट का स्नैपशॉट लेता है इसलिए यह अपरिवर्तनीय है।

यहाँ एक उदाहरण है जो चित्रण में मदद कर सकता है:

>> A = zeros(4); A(:) = 1:16

A =

     1     5     9    13
     2     6    10    14
     3     7    11    15
     4     8    12    16

>> i = 1; for col = A; disp(col'); A(:,i) = i; i = i + 1; end;
     1     2     3     4

     5     6     7     8

     9    10    11    12

    13    14    15    16

>> A

A =

     1     2     3     4
     1     2     3     4
     1     2     3     4
     1     2     3     4

7

जब स्ट्रिंग्स के सेल सरणियों पर पुनरावृत्ति होती है, तो लूप वेरिएबल (इसे कॉल करते हैं f) एक एकल-तत्व सेल सरणी बन जाता है। f{1}हर जगह लिखने के लिए थकाऊ हो जाता है, और लूप चर को संशोधित करने से एक स्वच्छ समाधान प्रदान करता है।

% This example transposes each field of a struct.
s.a = 1:3;
s.b = zeros(2,3);
s % a: [1 2 3]; b: [2x3 double]
for f = fieldnames(s)'
    s.(f{1}) = s.(f{1})';
end
s % a: [3x1 double]; b: [3x2 double]

% Redefining f simplifies the indexing.
for f = fieldnames(s)'
    f = f{1};
    s.(f) = s.(f)';
end
s % back to a: [1 2 3]; b: [2x3 double]

5

मान लें कि आपके पास डेटा की एक सरणी है:

n = [1    2   3   4   6   12  18  51  69  81  ]

तो आप इसे इस तरह से 'फ़र्क' कर सकते हैं:

for i = n, i, end

यह n में हर तत्व को प्रतिध्वनित करेगा (लेकिन अधिक दिलचस्प सामग्री के साथ i की जगह निश्चित रूप से संभव है!)


4

मुझे लगता है कि यह वही है जो ओपी वास्तव में चाहता है:

array = -1:0.1:10

for i=1:numel(array)
    disp(array(i))
end

यह सिर्फ 10 प्रिंट करता है क्योंकि numel(array)सरणी में तत्वों की संख्या है। शायद आपका मतलब था 1:numel(array)?
क्लीस्ट

for i = -1:0.1:10; disp(i); end;बेहतर नहीं होगा ?
ओरियल

4

आज (27 फरवरी) तक, MATLAB फ़ाइल एक्सचेंज पर एक नया फ़ॉर-प्रत्येक टूलबॉक्स है जो अवधारणा को पूरा करता है foreachforeachMATLAB भाषा का हिस्सा नहीं है, लेकिन इस टूलबॉक्स का उपयोग हमें क्या करने की क्षमता का अनुकरण करने की क्षमता देता foreachहै।

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