sirve - seleccionar elementos de una matriz matlab
La funciĆ³n Loopless hace un llamado a los vectores/miembros de la matriz en Matlab/Octave (4)
En matlab el ''.'' el prefijo en los operadores es una operación de elemento.
Pruebe algo como esto:
function r = newfun(v)
r = a.*exp(-(v-b).^2./(2*c^2))
end
Entré en el mundo de la matriz desde el mundo del 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 lo hago actualmente:
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 sobre MATLAB / Octave dicen: DETÉNGASE cada vez que se atrape usando bucles y piense en una mejor manera de hacerlo.
Por lo tanto, mi pregunta: ¿Se puede llamar a una función en cada miembro de un vector / matriz y devolver el resultado en un nuevo vector / matriz a la vez sin usar bucles explícitos?
Es decir, estoy buscando algo como esto:
function retval = newfun(v)
retval = 42*(v^23);
endfunction
Tal vez, es solo azúcar sintáctico, eso es todo, pero aún sería útil saberlo.
La función debería verse así:
function retval = gauss(v, a, b, c)
retval = a*exp(-(v-b).^2/(2*c^2));
Le recomendaría que lea la documentación de MATLAB sobre cómo vectorizar el código y evitar los bucles:
Guía de Vectorización de Código
Técnicas para mejorar el rendimiento
También recuerde que a veces el código con bucles puede ser más claro que el vectorizado, y con la reciente introducción del compilador JIT, MATLAB trata bastante bien con bucles.
Sí.
function retval = newfun(v)
retval = a*exp(-((v-b).^2)/(2*c*c));
endfunction
ARRAYFUN (y sus familiares) es la forma habitual de hacerlo.
Pero en tu caso particular, puedes hacer
mycurve = a*exp(-(d-b).^2/(2*c^2));
No es solo azúcar sintáctico; la eliminación de bucles hace que su código se ejecute sustancialmente más rápido.