MATLAB में एक फोरचेक संरचना है? यदि ऐसा है, तो क्या होता है यदि अंतर्निहित डेटा में बदलाव होता है (अर्थात यदि ऑब्जेक्ट सेट में जोड़े जाते हैं)?
MATLAB में एक फोरचेक संरचना है? यदि ऐसा है, तो क्या होता है यदि अंतर्निहित डेटा में बदलाव होता है (अर्थात यदि ऑब्जेक्ट सेट में जोड़े जाते हैं)?
जवाबों:
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
A
एक पंक्ति वेक्टर है, न कि कॉलम वेक्टर। यदि A
एक मैट्रिक्स है, तो प्रत्येक k उस मैट्रिक्स से एक कॉलम वेक्टर होगा। इसलिए, यदि आवश्यक हो तो स्थानांतरण ( A'
) या वेक्टराइज़ ( A(:)'
) करें।
.m
फाइलों में मतलाब के साथ काम करने के लिए जावा जैसा कोड आपकी पहली पसंद होना चाहिए ।
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
नहीं करता है (क्योंकि इस एक को अनंत स्मृति आवंटित करने की आवश्यकता होगी)। देखें लोरेन के ब्लॉग जानकारी के लिए।
यह भी ध्यान दें कि आप सेल सरणियों पर पुनरावृति कर सकते हैं।
लूप के लिए 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
यदि आप सेल सरणी पर लूप करने की कोशिश कर रहे हैं और सेल में प्रत्येक तत्व पर कुछ लागू करते हैं, तो देखें cellfun
। वहाँ भी है arrayfun
, bsxfun
और structfun
जो आपके कार्यक्रम को सरल बना सकता है।
उह! साफ सवाल।
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
जब स्ट्रिंग्स के सेल सरणियों पर पुनरावृत्ति होती है, तो लूप वेरिएबल (इसे कॉल करते हैं 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]
आज (27 फरवरी) तक, MATLAB फ़ाइल एक्सचेंज पर एक नया फ़ॉर-प्रत्येक टूलबॉक्स है जो अवधारणा को पूरा करता है foreach
। foreach
MATLAB भाषा का हिस्सा नहीं है, लेकिन इस टूलबॉक्स का उपयोग हमें क्या करने की क्षमता का अनुकरण करने की क्षमता देता foreach
है।
Undefined function or variable 'B'
।