Je suis un peu surpris que MATLAB n'ait pas de fonction Map, alors j'en ai piraté une moi-même car c'est quelque chose dont je ne peux pas me passer. Existe-t-il une meilleure version? Existe-t-il une bibliothèque de programmation fonctionnelle quelque peu standard pour MATLAB qui me manque?
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
l'utilisation serait par exemple
map( @(x)x^2,1:10)
matlab
functional-programming
map-function
Will Ness
la source
la source
map
,foldl
(également connu sous le nom dereduce
),select
(akafilter
), et d'autres goodies indispensables. Recommandé (si vous devez utiliser Matlab).Réponses:
La réponse courte: la fonction intégrée
arrayfun
fait exactement ce que votremap
fonction fait pour les tableaux numériques:Il existe deux autres fonctions intégrées qui se comportent de la même manière:
cellfun
(qui opère sur des éléments de tableaux de cellules) etstructfun
(qui opère sur chaque champ d'une structure).Cependant, ces fonctions ne sont souvent pas nécessaires si vous tirez parti de la vectorisation, en particulier en utilisant des opérateurs arithmétiques élémentaires . Pour l'exemple que vous avez donné, une solution vectorisée serait:
Certaines opérations opéreront automatiquement sur les éléments (comme l'ajout d'une valeur scalaire à un vecteur) tandis que d'autres opérateurs ont une syntaxe spéciale pour l'opération élément par élément (indiquée par un
.
avant l'opérateur). De nombreuses fonctions intégrées dans MATLAB sont conçues pour fonctionner sur des arguments vectoriels et matriciels en utilisant des opérations élémentaires (souvent appliquées à une dimension donnée, commesum
etmean
par exemple), et ne nécessitent donc pas de fonctions de carte.Pour résumer, voici quelques façons différentes de mettre au carré chaque élément d'un tableau:
Bien sûr, pour une opération aussi simple, l'option n ° 1 est le choix le plus judicieux (et efficace).
la source
En plus des opérations vectorielles et élémentaires, il existe également
cellfun
des fonctions de mappage sur des tableaux de cellules. Par exemple:Si 'UniformOutput' est vrai (ou non fourni), il tentera de concaténer les résultats en fonction des dimensions du tableau de cellules, donc
la source
Une solution assez simple, utilisant la vectorisation de Matlab serait:
Maintenant, en tapant
Retour
c (b) est une référence à un vecteur de taille 5 avec les éléments de c aux indices donnés par b. Maintenant, si vous assignez des valeurs à ce vecteur de référence, les valeurs d'origine de c sont écrasées, car c (b) contient des références aux valeurs de c et aucune copie.
la source
Il semble que le arrayfun intégré ne fonctionne pas si le résultat nécessaire est un tableau de fonctions: par exemple: map (@ (x) [xx ^ 2 x ^ 3], 1: 10)
de légers mods ci-dessous améliorent ce fonctionnement:
la source
..., 'UniformOutput', false);
pour créer une sortie de tableau de cellules contenant vos tableaux, puis de les formater et de les combiner comme vous le souhaitez dans un tableau non cellulaire.Si matlab n'a pas de fonction de carte intégrée, cela peut être dû à des considérations d'efficacité. Dans votre implémentation, vous utilisez une boucle pour parcourir les éléments de la liste, ce qui est généralement mal vu dans le monde matlab. La plupart des fonctions matlab intégrées sont "vectorisées", c'est-à-dire qu'il est plus efficace d'appeler une fonction sur un tableau entier que de l'itérer soi-même et d'appeler la fonction pour chaque élément.
En d'autres termes, ce
est beaucoup plus rapide que ça
en supposant votre définition de la carte.
la source
Vous n'en avez pas besoin
map
car une fonction scalaire appliquée à une liste de valeurs est appliquée à chacune des valeurs et fonctionne donc de manière similaire àmap
. Essayez justeDans votre cas particulier, vous pourriez même écrire
la source
Vectoriser la solution comme décrit dans les réponses précédentes est probablement la meilleure solution pour la vitesse. La vectorisation est également très matlaby et se sent bien.
Cela dit, Matlab a maintenant une classe de conteneur Map.
Voir http://www.mathworks.com/help/matlab/map-containers.html
la source
cellfun
et al., Pas de tables de hachage ou de paires clé-valeur.