Estoy un poco sorprendido de que MATLAB no tenga una función de mapa, así que yo mismo pirateé una, ya que es algo sin lo que no puedo vivir. ¿Existe una versión mejor? ¿Existe una biblioteca de programación funcional algo estándar para MATLAB 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)
matlab
functional-programming
map-function
Will Ness
fuente
fuente
map
,foldl
(también conocido comoreduce
),select
( también conocido como )filter
y otros beneficios indispensables. Recomendado (si tiene que usar Matlab).Respuestas:
La respuesta corta: la función incorporada
arrayfun
hace exactamente lo que hace sumap
función para matrices numéricas:Hay otras dos funciones integradas que se comportan de manera similar:
cellfun
(que opera en elementos de matrices de celdas) ystructfun
(que opera en cada campo de una estructura).Sin embargo, estas funciones a menudo no son necesarias si aprovecha la vectorización, específicamente utilizando operadores aritméticos de elementos . Para el ejemplo que dio, una solución vectorizada sería:
Algunas operaciones operarán automáticamente entre elementos (como agregar un valor escalar a un vector), mientras que otros operadores tienen una sintaxis especial para la operación de elementos (indicada por una
.
antes del operador). Muchas funciones integradas en MATLAB están diseñadas para operar en argumentos vectoriales y matriciales utilizando operaciones basadas en elementos (a menudo aplicadas a una dimensión determinada, comosum
ymean
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:
Por supuesto, para una operación tan simple, la opción # 1 es la opción más sensata (y eficiente).
fuente
Además de las operaciones vectoriales y de elementos, también hay
cellfun
funciones de mapeo sobre matrices de celdas. Por ejemplo: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
fuente
Una solución bastante simple, usando la vectorización de Matlab, sería:
Ahora, escribiendo
devoluciones
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 hay copias.
fuente
Parece que la función de matriz incorporada no funciona si el resultado necesario es una matriz de función: por ejemplo: mapa (@ (x) [xx ^ 2 x ^ 3], 1:10)
las modificaciones leves a continuación hacen que esto funcione mejor:
fuente
..., 'UniformOutput', false);
para crear una salida de matriz de celdas que contenga sus matrices, luego formatee y combine como desee en una matriz que no sea de celda.Si matlab no tiene una función de mapa incorporada, podría deberse a consideraciones de eficiencia. En su implementación, está utilizando un bucle para iterar sobre los elementos de la lista, que generalmente está mal visto en el mundo de matlab. La mayoría de las funciones integradas 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, este
es mucho más rápido que esto
asumiendo su definición de mapa.
fuente
No es necesario,
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 amap
. Sólo inténtaloEn tu caso particular, incluso podrías escribir
fuente
Vectorizar la solución como se describe en las respuestas anteriores es probablemente la mejor solución para la velocidad. La vectorización también es muy Matlaby y se siente bien.
Dicho esto, Matlab ahora tiene una clase de contenedor Map.
Consulte http://www.mathworks.com/help/matlab/map-containers.html
fuente
cellfun
et al., No de tablas hash o pares clave-valor.