vectores una sirve seleccionar que para matriz hold graficar funciones extraer elementos datos almacenar agregar matlab matrix octave

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.