2009-12-25 21 views
7

Supongamos que tienen una función y (t, x) = exp (-t) * sin (x)¿Cómo se genera una función de dos variables sin usar ningún bucle?

En Matlab, defino

t = [0: 0.5: 5]; 
x = [0: 0.1: 10*2*pi]; 
y = zeros(length(t), length(x)); % empty matrix init 

Ahora, ¿Cómo defino matriz y sin utilizando cualquier bucle, de modo que cada elemento y (i, j) contenga el valor de la función deseada y en (t(i), x(j))? A continuación se muestra cómo lo hice usando un ciclo for.

for i = 1:length(t) 
    y(i,:) = exp(-t(i)) .* sin(x); 
end 
+0

No estoy seguro de que pueda - ¿el bucle tarda demasiado en ejecutarse, o por qué desea hacerlo? –

+0

El bucle no es un problema aquí en este sencillo ejemplo. ¡Pero quiero aprender la manera de hacerlo sin bucle para vectores realmente grandes! – Aamir

Respuesta

12

Su entrada vectores de x es 1xN y t es 1xM, matriz de salida y es MxN. Para vectorizar el código, tanto x como t deben tener la misma dimensión que y.

[x_,t_] = meshgrid(x,t); 
y_ = exp(-t_) .* sin(x_); 

Su ejemplo es un caso 2D simple. La función meshgrid() también funciona en 3D. A veces no puede evitar el bucle, en tales casos, cuando su bucle puede ser 1: N o 1: M, elija el más corto. Otra función que uso para preparar el vector para la ecuación vectorizada (vector x multiplicación de matriz) es diag().

+0

¡voila! gracias por una solución tan elegante. – Aamir

6

no es necesario meshgrid; simplemente use:

y = exp(-t(:)) * sin(x(:)'); %multiplies a column vector times a row vector. 
+0

+1 para una solución de multiplicación de matriz simple y elegante. – gnovice

Cuestiones relacionadas