2009-12-25 9 views
7

Supponiamo di avere una funzione y (t, x) = exp (-t) * sin (x)Come generare una funzione di due variabili senza utilizzare alcun ciclo?

In Matlab, definisco

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

Ora, come posso definisco matrice y colpo utilizzando qualsiasi loop, tale che ogni elemento y (i, j) contenga il valore della funzione desiderata y a (t(i), x(j))? Di seguito è riportato come l'ho fatto utilizzando un ciclo for.

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

Non è sicuro che sia possibile - il ciclo richiede molto tempo per essere eseguito, o perché lo si desidera? –

+0

Il loop non è un problema qui in questo semplice esempio. Ma voglio imparare il modo di farlo senza loop per vettori davvero grandi! – Aamir

risposta

12

Your input vettori x è 1xN e t è 1xM, matrice di uscita y è MxN. Per vettorizzare il codice, x e t devono avere la stessa dimensione di .

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

L'esempio è un semplice caso 2D. La funzione meshgrid() funziona anche in 3D. A volte non puoi evitare il ciclo, in questi casi, quando il tuo loop può andare su 1: N o 1: M, scegli il più corto. Un'altra funzione che uso per preparare il vettore per l'equazione vettorizzata (moltiplicazione di matrice vettore x) è diag().

+0

voilà! grazie per una soluzione così elegante – Aamir

6

non è necessario meshgrid; utilizzare semplicemente:

+0

+1 per una soluzione di moltiplicazione di matrice semplice ed elegante. – gnovice

Problemi correlati