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.

¿Fue útil?

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:

Código Guía de Vectorización

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top