2012-06-06 20 views
11

¿Puedo escribir lo siguiente en un trazador de líneas único?Comprensión de la lista de Matlab

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

Supongamos que la función foo no maneja las matrices como se esperaba. En mi caso, foo devuelve un escalar incluso cuando se da una matriz como argumento.

En Python, por ejemplo, se vería así:

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

Respuesta

10

arrayfun es lo que necesita. Por ejemplo:

res = arrayfun(@foo, x) 

Desde foo siempre devuelve un escalar, el anterior funcionará y res También habrá un vector de las mismas dimensiones que x. Si foo devuelve salida de longitud variable, tendrá que configurar 'UniformOutput' en false o 0 en la llamada al arrayfun. La salida será entonces una matriz cell.

+1

¿Qué hace el "@"? –

+1

@LucyBrennan Crea un [identificador de función] (http://www.mathworks.com/help/techdoc/matlab_prog/brfpxgt-1.html). Puede leer esa página del documento y los enlaces relacionados para obtener más información – abcd

+1

Thx. ¿Qué pasa si foo realmente toma dos argumentos, y quiero mantener el segundo argumento como constante en todas las iteraciones? –

6

sólo para añadir a la buena respuesta de @yoda, en lugar de utilizar UniformOutput, también se puede utilizar {} paréntesis:

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

También, en algunas ocasiones, se foo ya vectorizado.

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

¿Podría explicar con un poco más de detalle qué significa 'foo = @ (t) (power (t, 2));'? –

+0

el problema es qué pasa si quiero hacer algo como '{i^2 para i a N}'? Pero no quiero definir una función para '^ 2', ¿hay alguna alternativa? –

Cuestiones relacionadas