2011-02-13 13 views
14

Digamos que tengo una función calculateStuff (x) que toma un escalar como parámetro y devuelve un escalar.MATLAB: cómo aplicar la función componentwise

Decir que tengo un vector X y quiero aplicar calculateStuff en cada componente X, y obtener un vector de los resultados a cambio y almacenarlo en un nuevo vector Y.

Claramente Y = calculateStuff (X) es ilegal, ¿hay alguna manera de hacerlo además de un bucle?

+0

¿No se llama 'map'? – delnan

+1

@Robert: No realice [varias publicaciones de la misma pregunta.] (Http://stackoverflow.com/questions/4986451/matlab-how-to-apply-functions-componentwise) –

+0

posible duplicación de [Función Map en MATLAB?] (http://stackoverflow.com/questions/983163/map-function-in-matlab) – gnovice

Respuesta

16

tiene tres opciones:

  1. modificar calculateStuff para que pueda tomar las matrices y volver matrices
  2. escribe un bucle
  3. uso arrayfun para ocultar el bucle: Y = arrayfun(@calculateStuff,X)
9

mayoría Las operaciones de Matlab te permitirán ingresar una matriz y devolver una matriz. Debería poder volver a escribir calculateStuff() para tomar una matriz y devolver una matriz. En general, es MUCHO más rápido que usar un para el bucle. Los bucles en Matlab son muy caros en cuanto al tiempo.

El tipo de cosas que debe observar son las versiones "punto" de las operaciones normales. Por ejemplo en lugar de

y = z * x; 

hacer

y = z .* x; 

El primero hará una multiplicación de matrices, lo que probablemente no es lo que quiere cuando la vectorización de código. El segundo realiza una multiplicación elemento por elemento de z y x.

Consulte here y busque "Operaciones de puntos".

Cuestiones relacionadas