función Loopless pide a los miembros del vector / matriz en MATLAB / Octave
Pregunta
entré en mundo de la matriz de mundo bucle (C, etc)
Me gustaría llamar a una función en cada miembro individual de un vector / matriz, y devolver el vector / matriz resultante.
Así es como actualmente lo hago:
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
Ejemplo de uso:
octave:47> d=[1:1000];
octave:48> mycurve=gauss(d, 1, 500, 100);
Ahora, todos los consejos en MATLAB / Octave dice: STOP cada vez que te encuentres utilizando bucles y pensar en una mejor manera de hacerlo
.Por lo tanto, mi pregunta:? ¿Se puede llamar a una función en cada elemento de un vector / matriz y devolver el resultado en un nuevo vector / matriz de una sola vez sin necesidad de utilizar bucles explícitas
Es decir que estoy buscando algo como esto:
function retval = newfun(v)
retval = 42*(v^23);
endfunction
Tal vez, es simplemente azúcar sintáctica, eso es todo, pero aún así sería útil saber.
Solución
La función debe tener este aspecto:
function retval = gauss(v, a, b, c)
retval = a*exp(-(v-b).^2/(2*c^2));
Yo recomendaría que lea la documentación de MATLAB sobre cómo vectorizar el código y evitar bucles:
Técnicas para mejorar el rendimiento
Asimismo, recuerda que el código en algún momento con bucles puede ser más claro que uno vectorizado, y con la reciente introducción del compilador JIT ofertas MATLAB bucles con bastante bien.
Otros consejos
En el MATLAB ''. prefijo en los operadores es operación elemento a elemento.
Trate algo como esto:
function r = newfun(v)
r = a.*exp(-(v-b).^2./(2*c^2))
end
ARRAYFUN (y sus familiares) es la forma habitual de hacer eso.
Sin embargo, en su caso particular, sólo puede hacerlo
mycurve = a*exp(-(d-b).^2/(2*c^2));
No se trata sólo de azúcar sintáctica; la eliminación de bucles hace que su código funciona sustancialmente más rápido.
Sí.
function retval = newfun(v)
retval = a*exp(-((v-b).^2)/(2*c*c));
endfunction