titulo graficar grafica geometricas figuras comando matlab functional-programming map-function

graficar - Función de mapa en MATLAB?



plot matlab (7)

Estoy un poco sorprendido de que MATLAB no tenga una función de Mapa, así que la pirateé, ya que es algo que no puedo vivir sin ella. ¿Hay una mejor versión por ahí? ¿Existe una biblioteca de programación funcional algo estándar para MATLAB por ahí que me falta?

function results = map(f,list) % why doesn''t MATLAB have a Map function? results = zeros(1,length(list)); for k = 1:length(list) results(1,k) = f(list(k)); end end

el uso sería, por ejemplo

map( @(x)x^2,1:10)


Además de las operaciones vectoriales y de elementos, también cellfun funciones cellfun para funciones de mapeo sobre arreglos de células. Por ejemplo:

cellfun(@upper, {''a'', ''b'', ''c''}, ''UniformOutput'',false) ans = ''A'' ''B'' ''C''

Si ''UniformOutput'' es verdadero (o no se proporciona), intentará concatenar los resultados de acuerdo con las dimensiones de la matriz de celdas, por lo que

cellfun(@upper, {''a'', ''b'', ''c''}) ans = ABC


La respuesta corta: la función arrayfun hace exactamente lo que hace su función de map para matrices numéricas:

>> y = arrayfun(@(x) x^2, 1:10) y = 1 4 9 16 25 36 49 64 81 100

Hay otras dos funciones integradas que se comportan de manera similar: cellfun (que opera en elementos de matrices de celdas) y structfun (que opera en cada campo de una estructura).

Sin embargo, estas funciones a menudo no son necesarias si se aprovecha la vectorización, específicamente el uso de operadores aritméticos de elementos. Para el ejemplo que dio, una solución vectorizada sería:

>> x = 1:10; >> y = x.^2 y = 1 4 9 16 25 36 49 64 81 100

Algunas operaciones operarán automáticamente a través de los elementos (como agregar un valor escalar a un vector) mientras que otros operadores tienen una sintaxis especial para la operación de elemento (denotado por a . Antes del operador). Muchas de las funciones incorporadas en MATLAB están diseñadas para operar en vectores y argumentos de matriz utilizando operaciones de elementos (a menudo aplicadas a una dimensión dada, como sum y mean por ejemplo), y por lo tanto no requieren funciones de mapa.

Para resumir, aquí hay algunas formas diferentes de cuadrar cada elemento en una matriz:

x = 1:10; % Sample array f = @(x) x.^2; % Anonymous function that squares each element of its input % Option #1: y = x.^2; % Use the element-wise power operator % Option #2: y = f(x); % Pass a vector to f % Option #3: y = arrayfun(f, x); % Pass each element to f separately

Por supuesto, para una operación tan simple, la opción n. ° 1 es la opción más sensata (y eficiente).


No necesita map ya que una función escalar que se aplica a una lista de valores se aplica a cada uno de los valores y, por lo tanto, funciona de manera similar al map . Sólo inténtalo

l = 1:10 f = @(x) x + 1 f(l)

En tu caso particular, incluso podrías escribir

l.^2


Parece que la función de matriz integrada no funciona si el resultado necesario es una matriz de funciones: por ejemplo: mapa (@ (x) [xx ^ 2 x ^ 3], 1: 10)

ligeras modificaciones a continuación hacen que esto funcione mejor:

function results = map(f,list) % why doesn''t MATLAB have a Map function? for k = 1:length(list) if (k==1) r1=f(list(k)); results = zeros(length(r1),length(list)); results(:,k)=r1; else results(:,k) = f(list(k)); end; end; end


Si matlab no tiene una función integrada en el mapa, podría deberse a consideraciones de eficiencia. En su implementación, está utilizando un bucle para iterar sobre los elementos de la lista, lo que generalmente es desaprobado en el mundo de los matlab. La mayoría de las funciones incorporadas de matlab están "vectorizadas", es decir, es más eficiente llamar a una función en una matriz completa que iterar sobre ella y llamar a la función para cada elemento.

En otras palabras, esto

a = 1:10; a.^2

es mucho más rápido que esto

a = 1:10; map(@(x)x^2, a)

asumiendo su definición de mapa.


Una solución bastante simple, usando la vectorización de Matlab sería:

a = [ 10 20 30 40 50 ]; % the array with the original values b = [ 10 8 6 4 2 ]; % the mapping array c = zeros( 1, 10 ); % your target array

Ahora, escribiendo

c( b ) = a

devoluciones

c = 0 50 0 40 0 30 0 20 0 10

c (b) es una referencia a un vector de tamaño 5 con los elementos de c en los índices dados por b. Ahora, si asigna valores a este vector de referencia, los valores originales en c se sobrescriben, ya que c (b) contiene referencias a los valores en c y no a las copias.


Vectorizar la solución como se describe en las respuestas anteriores es probablemente la mejor solución para la velocidad. Vectorizar también es muy Matlaby y se siente bien.

Dicho esto, Matlab ahora tiene una clase de contenedor de mapas.

Ver http://www.mathworks.com/help/matlab/map-containers.html