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.

È stato utile?

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:

Codice Vettorizzazione Guida

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top