Matlab

2012-03-22 9 views
10

में तारों के साथ foreach पाश मैं एक लूप बनाना चाहता हूं जो कई तारों पर फिर से चालू होगा, लेकिन Matlab में ऐसा करने में असमर्थ।Matlab

क्या काम करता है:

for i=1:3 
    if (i==1) 
    b='cow'; 
    elseif (i==2) 
    b='dog'; 
    else 
    b='cat'; 
    end 

    disp(b); 
end 

और परिणाम है:

cow 
dog 
cat 

लेकिन क्या मैं चाहता हूँ और अधिक सुरुचिपूर्ण कि तरह दिखेगा कुछ है:

for i=['cow','dog','cat'] 
    disp (i); 
end 

और देना एक ही परिणाम।

क्या ऐसा करने के लिए मैटलैब में कोई विकल्प है?

अलावा:

मैं तार के रूप में शब्दों पर बाद में उपयोग करने के लिए और बस नहीं प्रदर्शित करने के लिए (disp सिर्फ एक उदाहरण के रूप में किया गया था) की जरूरत है।

clear all; 
close all; 
clc; 

global fp_a 
global TEST_TYPE 
global SHADE_METHODE 

for fp_a=11:24 
for shade={'full','fast'} 
    SHADE_METHODE=shade(1); 
    for test={'bunny','city'} 
     TEST_MODE=test(1); 
     fprintf ('fp_a:%d | test: %s | shade: %s',fp_a,TEST_TYPE,SHADE_METHODE); 
     ray_tracing; 
    end 
end 
end 

यह रूप में मान कोशिकाओं के रूप में रहते हैं और न तार मैं त्रुटि संदेश मिलता है काम नहीं करता है:: मैं अपने वास्तविक कार्यक्रम में सेल सरणियों का उपयोग करने की कोशिश की है

??? ==> fprintf फ़ंक्शन का उपयोग करने में त्रुटि 'सेल' इनपुट के लिए परिभाषित नहीं है।

* -मुझे वास्तव में fprintf की आवश्यकता नहीं है, मैं इसे जांचने के लिए उपयोग करता हूं कि मान सही हैं।

** - ray_tracing मेरी कोड तार

+2

अतिरिक्त में समस्या सिर्फ वाक्यविन्यास है। आपको घुंघराले ब्रेसिज़ का उपयोग करने की आवश्यकता है - 'परीक्षण {1} '- सेल से चार सरणी निकालने के लिए, सामान्य कोष्ठक नहीं -' परीक्षण (1)' - जो सरणी में पहला सेल चुनता है, प्रभावी रूप से यहां कुछ भी नहीं कर रहा है। ओली का उदाहरण कोड फिर से जांचें; ध्यान दें कि वह 'i {1}' में घुंघराले ब्रेसिज़ का उपयोग कर रहा है। (इसके अलावा, यदि आप इससे बच सकते हैं तो ग्लोबल्स का उपयोग न करें।) –

+0

आपको 'SHADE_METHODE = छाया {1};' SHADE_METHODE = छाया (1) के बजाय '' – Oli

+0

संभावित डुप्लिकेट का उपयोग करना चाहिए [क्या MATLAB में कोई foreach है? यदि हां, तो अंतर्निहित डेटा में परिवर्तन होने पर यह कैसा व्यवहार करता है?] (Http://stackoverflow.com/questions/408080/is-there-a-foreach-in-matlab-if-so-how-does-it-behave -if-the-underlying-data-c) –

उत्तर

28

या आप कर सकते हैं:

for i={'cow','dog','cat'} 
    disp(i{1}) 
end 

परिणाम:

cow 
dog 
cat 
+6

अच्छा। अगर Matlab में लिखने के बारे में केवल हर वास्तव में अच्छी चीज कुछ सचमुच भयानक नहीं है। – beOn

2

ज़रूर के मूल्यों का उपयोग करता है है! तारों को रखने के लिए सेल सरणी का उपयोग करें (सामान्य सरणी में, तारों को तार द्वारा माना जाता है, जो काम कर सकता है यदि सभी तारों की लंबाई समान है, लेकिन अन्यथा बर्क होगा)।

opts={'cow','dog','cat'} 
for i=1:length(opts) 
    disp(opts{i}) 
end 
5

आपका समस्याओं शायद रास्ता MATLAB तार हैंडल के कारण होता है। MATLAB तार सिर्फ पात्रों के सरणी हैं। जब आप ['cow','dog','cat'] पर कॉल करते हैं, तो आप 'cowdogcat' बना रहे हैं क्योंकि [] किसी भी घोंसले के बिना सरणी को व्यवस्थित करता है। यदि आप घोंसले के व्यवहार चाहते हैं तो आप सेल एरर का उपयोग कर सकते हैं जो {} का उपयोग करके बनाए गए हैं। for अपने दाएं हाथ के कॉलम पर पुनरावृत्त करता है। इसका मतलब है कि आप उपरोक्त वर्णित मुहावरे का उपयोग कर सकते हैं; ओली पहले से ही एक समाधान प्रदान किया। सामान्य और सेल सरणी के बीच अंतर दिखाने के लिए यह मुहावरे भी एक अच्छा तरीका है।

%Cell array providing the correct solution 
for word = {'cow','dog','cat'} 
    disp(word{1}) %word is bound to a 1x1 cell array. This extracts its contents. 
end 

cow 
dog 
cat 


%Normal array providing weirdness 
for word = ['cow','dog','cat'] %Same as word = 'cowdogcat' 
    disp(word) %No need to extract content 
end 

c 
o 
w 
d 
o 
g 
c 
a 
t