2012-03-22 12 views
10

Birkaç dizede yinelenecek, ancak Matlab'da yapılamayan bir döngü oluşturmak istiyorum.Matlabdaki dizeleri içeren foreach döngüsü

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

    disp(b); 
end 

ve sonucudur:

ne işleri olduğunu

cow 
dog 
cat 

Ama ne istediğim gibi görünecektir daha şık bir şeydir:

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

ve vermek aynı sonuç.

Bunu yapmak için Matlab'da bir seçenek var mı?

ADDITION:

ben kullanmak ve sadece (disp sadece bir örnek olarak oldu) daha sonra göstermeye üzerinde dizeleri olarak kelimeleri gerekir. değerleri hücreleri olarak kalmak ve şu hata mesajını alıyorum dizeleri olarak değil

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 

O çalışmıyor: benim gerçek programda hücre dizileri kullanmayı denedim

??? ==> fprintf kullanılırken hata 'hücre' girişleri için tanımlanmamış.

* -Gerçekten ben sadece değerler doğru olup olmadığını kontrol için kullanabilirsiniz fprintf gerekmez.

**

- ray_tracing dizeleri

+2

Ekteki sorun yalnızca sözdizimi. Kıvrımlı parantezleri kullanmanız gerekir - "test {1}" - dizideki hücre dizisini çıkarmak için normal parantez değil - "test (1)" - dizideki ilk hücreyi seçer, burada hiçbir şey yapmaz. Oli'nın örnek kodunu tekrar kontrol edin; "i {1}" deki küme parantezlerini kullandığını unutmayın. (Ayrıca, bunu önlemek için globals kullanmayın. –

+0

'SHADE_METHODE = shade {1};' yerine SHADE_METHODE = shade (1); ' – Oli

+0

olası duplicate [MATLAB içinde foreach var mı? Eğer öyleyse, temeldeki veriler değişirse nasıl davranır?] (Http://stackoverflow.com/questions/408080/is-there-a-foreach-in-matlab-if-so-how-does-it-behave -if-the-under-data-c) –

cevap

28

Yoksa yapabilirsiniz:

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

Sonuç:

cow 
dog 
cat 
+6

Güzel. Matlab'da yazmayla ilgili gerçekten güzel şeyler gerçekten dehşet verici bir şeyle dengelenmemiş olsaydı. – beOn

2

Emin değerlerini kullanır benim kodudur! Dizeleri tutmak için hücre dizileri kullanın (normal dizilerde, dizeler karakter olarak kabul edilir; bu, tüm dizelerin aynı uzunlukta olmasına karşın çalışabilir, ancak aksi halde aksi halde).

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

Sorunlarınız muhtemelen MATLAB dizeleri işleme biçimi kaynaklanır. MATLAB dizeleri sadece karakter dizileridir. ['cow','dog','cat']'u aradığınızda, yuvalama olmadan dizileri birleştirdiği için 'cowdogcat' biçimini oluşturuyorsunuz. Yuvalama davranışı istiyorsanız, {} kullanılarak oluşturulan hücre dizilerini kullanabilirsiniz. for, sağ tarafındaki sütunların üzerinde yinelenir. Bu, yukarıda bahsettiğiniz deyimi kullanabileceğiniz anlamına gelir; Oli zaten bir çözüm sağladı. Bu deyim, normal ve hücre dizileri arasındaki farkı göstermek için iyi bir yoldur.

%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 
İlgili konular