2012-06-06 4 views
11

Czy mogę napisać co następuje w jednym wkładzie?Zrozumienie listy Matlab

x = [1,3,5] 
res = zeros(1,size(x,2)); 
for i=1:size(x,2); 
    res(i) = foo(x(i); 
end; 

Załóżmy, że funkcja foo nie obsługuje tablic zgodnie z oczekiwaniami. W moim przypadku foo zwraca wartość skalarną, nawet jeśli podaje tablicę jako argument.

W Pythonie, na przykład, to będzie wyglądać następująco:

x = [1,3,5] 
res = [foo(y) for y in x] 

Odpowiedz

10

arrayfun jest to, czego potrzebujesz. Na przykład:

res = arrayfun(@foo, x) 

Od foo zawsze zwraca skalar, powyższe będzie pracować i res będzie również wektor o tych samych wymiarach jak x. Jeśli foo zwraca dane wyjściowe o zmiennej długości, wówczas musisz ustawić 'UniformOutput' na false lub 0 w wywołaniu arrayfun. Wyjście będzie wtedy tablicą cell.

+1

Co robi "@"? –

+1

@LucyBrennan Tworzy [uchwyt funkcji] (http://www.mathworks.com/help/techdoc/matlab_prog/brfpxgt-1.html). Możesz przeczytać tę stronę dokumentu i powiązane linki, aby uzyskać więcej informacji. – abcd

+1

Thx. Co jeśli foo rzeczywiście bierze dwa argumenty i chcę utrzymać drugi argument jako stałą we wszystkich iteracjach? –

6

Wystarczy dodać do dobrej odpowiedzi na @yoda, zamiast korzystania UniformOutput, można również użyć {} wsporniki:

res = arrayfun(@(t){foo(t)}, x) 

Ponadto, w niektórych przypadkach, foo już wektorowy.

x = 1:10; 
foo = @(t)(power(t,2)); 
res = foo(x); 
+0

można wyjaśnić w nieco bardziej szczegółowo, co 'foo = @ (t) (moc (t, 2)); oznacza? –

+0

problemem jest to, co jeśli chcę zrobić coś w stylu '{i^2 for i to N}'? Ale nie chcę zdefiniować funkcji dla '^ 2', czy istnieje alternatywa? –