2011-10-19 11 views
7

MATLAB następujące for pętli:Pętla nie iteracyjne

for i = [1:100]' 
    %'// Do something, such as disp(i) 
end 

jest najwyraźniej nie bardzo realizowane przez iterację, a i się matrycę [1 2 3 ... 100], a " pętla "jest wykonywana tylko raz na tej macierzy i. Możesz to sprawdzić, drukując wartość i lub inne informacje o śledzeniu. Przez pętlę przechodzi tylko jedno przejście.

Czy można zmusić MATLAB do wykonania prawdziwej pętli? Powodem, dla którego pytam, jest to, że powyższe podejście jest dobre dla wielu przypadków, ale o wiele bardziej bolesne, gdy masz zagnieżdżone pętle, które trzeba uruchomić.

Przykład:
Poniższy kod nie zrobi to, czego można się spodziewać, jeśli myślałeś, że coraz rzeczywisty iteracji przez pętlę:

for i = outlier 
    data(i) = median(data(i-100:i+100)) 
end 

Można by się spodziewać w każdym indeksie Outlier ten zastąpiłby dane (i) z medianą danych z i-100 do i + 100, ale tak nie jest. W rzeczywistości mediana zwraca pojedynczą wartość obliczoną na konglomeracie wszystkich zakresów, o które się troszczyłeś, a każdy punkt danych (i) jest zastępowany tą pojedynczą wartością.

+2

można zakładać, że wyjście odtwarza to, co widzisz. Nie widziałem tego zachowania i dużo uwagi poświęcałem pętlom w Matlab. – Iterator

+0

Nie masz na myśli "median (dane (i-100: i + 100))"? (z ":") –

+0

@Clement J. Tak, robię. Poprawione teraz. –

Odpowiedz

12

Jeśli piszesz

for i = (1:100)' %'# square brackets would work as well 
    doSomething 
end 

pętla jest wykonywana tylko raz, ponieważ for -loop iteracje nad wszystkim kolumny o cokolwiek znajduje się po prawej stronie znaku równości (byłoby iteracyjne 200 razy z Tablica 100 na 200 po prawej stronie znaku równości).

Jednak w twoim przykładzie masz i=[1:100], który ocenia wektor wiersza. Zatem pętla powinna wykonać 100x.

Jeśli iteracyjne nad tablicy, które mogą być nx1 zamiast 1xn można, ze względów bezpieczeństwa, napisać:

for i = myArray(:)' %'# guarantee nx1, then transpose to 1xn 
end 
+1

+1. Z wyjątkiem ostatniego akapitu: pętla 'i = [1: 100]' (podobnie jak w pseudokodowym OP) wykonuje 100 razy, nie jeden raz. –

+0

@AndrewJanke: D'oh! Mistype! – Jonas

7

To nie jest poprawne. Kod:

for i=1:100 
    disp(i) 
end 

wydrukuje wszystkie wartości od 1 do 100 kolejno. Podczas gdy Matlab zachęca do wektoryzacji, możesz zdecydowanie użyć tradycyjnych pętli ze stylem kodowania, którego użyłeś powyżej.

+0

+1 Lepsza odpowiedź. :) Nigdy nie widziałem zachowania opisanego przez OP, a ja zwracam raczej uwagę na iteracje (zwróć uwagę na nazwę użytkownika ...). Nie jestem pewien, co może być przyczyną zgłoszonego zachowania. – Iterator

+5

Jego zmienna 'outlier' może być wektorem kolumny. Pętle 'for' programu Matlab iterują po kolumnach czegoś, a nie elementów. W przypadku wektorów wierszowych, takich jak [1: 100], jest to ta sama rzecz; ale 'for i = [1: 100] '' zrobi jedno przejście. –

+1

@Iterator: zachowanie występuje, jeśli tablica ma wartość nx1 zamiast 1xn. – Jonas

Powiązane problemy