2012-03-22 15 views
10

Chcę utworzyć pętlę, która będzie iterować przez kilka ciągów, ale nie można tego zrobić w programie Matlab.pętla foreach z ciągami w Matlab

Co działa to:

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

    disp(b); 
end 

a wynik jest:

cow 
dog 
cat 

Ale co chcę jest coś bardziej eleganckie, że będzie wyglądać następująco:

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

i dać ten sam wynik.

Czy istnieje opcja w Matlab, aby to zrobić?

Ponadto:

muszę słowa jak ciągi później użyć, a nie tylko do wyświetlania (the disp był tylko jako przykład). Próbowałem używać tablic komórkowych w moim prawdziwym programie:

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 

To nie działa jako wartości pozostać jako komórki, a nie ciągi otrzymuję komunikat o błędzie:

??? Błąd przy użyciu ==> fprintf Funkcja nie jest zdefiniowana dla wejść "komórki".

* - Naprawdę nie potrzebuję fprintf Po prostu używam go do sprawdzenia, czy wartości są prawidłowe.

** - ray_tracing jest mój kod, który używa wartości ciągów

+2

Problem w dodawaniu to tylko składnia. Musisz użyć nawiasów klamrowych - 'test {1}' - aby wyodrębnić tablicę znaków z komórki, a nie normalne nawiasy - 'test (1)' - która właśnie wybiera pierwszą komórkę w tablicy, skutecznie nic tu nie robiąc. Ponownie sprawdź przykładowy kod Oli; zauważ, że używa nawiasów klamrowych w 'i {1}'. (Nie wolno również używać globali, jeśli można tego uniknąć.) –

+0

Powinieneś użyć 'SHADE_METHODE = shade {1};' zamiast 'SHADE_METHODE = shade (1);' – Oli

+0

możliwy duplikat [Czy istnieje foreach w MATLAB? Jeśli tak, jak się zachowuje, jeśli zmieniają się dane?] (Http://stackoverflow.com/questions/408080/is-there-a-foreach-in-matlab-if-so-how-does-it-behave -if-the-basis-data-c) –

Odpowiedz

28

Albo można zrobić:

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

Wynik:

cow 
dog 
cat 
+6

Niezły. Gdyby tylko każda naprawdę dobra rzecz dotycząca pisania w Matlab nie była zrekompensowana czymś naprawdę okropnym. – beOn

2

pewno! Użyj tablic komórek do utrzymywania ciągów znaków (w normalnych tablicach łańcuchy są traktowane przez znak, co może działać, jeśli wszystkie łańcuchy mają taką samą długość, ale w przeciwnym wypadku będą działać inaczej).

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

Twoje problemy są prawdopodobnie spowodowane przez sposób MATLAB obsługuje ciągi. Ciągi MATLAB są po prostu tablicami znaków. Podczas wywoływania ['cow','dog','cat'] tworzysz 'cowdogcat', ponieważ [] łączy tablice bez żadnego zagnieżdżenia. Jeśli chcesz zagnieżdżać, możesz użyć macierzy komórek zbudowanych przy użyciu {}. for iteruje po kolumnach po prawej stronie. Oznacza to, że możesz użyć idiomu wspomnianego powyżej; Oli dostarczył już rozwiązanie. Ten idiom jest również dobrym sposobem na pokazanie różnicy między tablicami normalnymi i komórkowymi.

%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