funzione Loopless invita membri vettore / matrice in Matlab / Octave
Domanda
sono venuto nel mondo a matrice da mondo loop (C, ecc)
desidero chiamare una funzione a ciascun membro di un vettore / matrice, e restituire il vettore / matrice risultante.
Questo è il modo Io attualmente faccio:
function retval = gauss(v, a, b, c)
for i = 1:length(v)
retval(i) = a*(e^(-(v(i)-b)*(v(i)-b)/(2*c*c)));
endfor
endfunction
Esempio di utilizzo:
octave:47> d=[1:1000];
octave:48> mycurve=gauss(d, 1, 500, 100);
Ora, tutti i consigli su MATLAB / Octave dice: ARRESTO ogni volta che vi accorgete che state usando loop e pensare ad un modo migliore di farlo
.Quindi, la mia domanda:? Si può chiamare una funzione su ciascun membro di un vettore / matrice e restituire il risultato in un nuovo vettore / matrice tutto in una volta senza l'utilizzo di loop esplicite
E 'Sto cercando qualcosa di simile:
function retval = newfun(v)
retval = 42*(v^23);
endfunction
Forse, è lo zucchero sintattico, che è tutto, ma ancora sarebbe utile conoscere.
Soluzione
La funzione dovrebbe essere simile a questo:
function retval = gauss(v, a, b, c)
retval = a*exp(-(v-b).^2/(2*c^2));
Io vi consiglierei di leggere la documentazione MATLAB su come vettorizzare il codice e evitare loop:
tecniche per migliorare le prestazioni
Anche ricordare che il codice a volte con i loop può essere più chiaro che uno vettorializzare, e con la recente introduzione delle offerte MATLAB JIT compiler con i cicli abbastanza bene.
Altri suggerimenti
in MATLAB l' '' prefix operatori è un'operazione elemento-saggio.
Provare qualcosa di simile a questo:
function r = newfun(v)
r = a.*exp(-(v-b).^2./(2*c^2))
end
ARRAYFUN (e dei suoi parenti) è il solito modo per farlo.
Ma nel tuo caso particolare, si può solo fare
mycurve = a*exp(-(d-b).^2/(2*c^2));
Non è solo zucchero sintattico; eliminando i loop rende il codice eseguito sostanzialmente più veloce.
Sì.
function retval = newfun(v)
retval = a*exp(-((v-b).^2)/(2*c*c));
endfunction