Ich bin ein wenig überrascht, dass MATLAB keine Map-Funktion hat, also habe ich selbst eine gehackt, da es etwas ist, ohne das ich nicht leben kann. Gibt es da draußen eine bessere Version? Gibt es eine etwas standardmäßige funktionale Programmierbibliothek für MATLAB, die mir fehlt?
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
Verwendung wäre zB
map( @(x)x^2,1:10)
matlab
functional-programming
map-function
Will Ness
quelle
quelle
map
,foldl
(auch bekannt alsreduce
),select
(akafilter
) und andere unentbehrliche Leckereien. Empfohlen (wenn Sie Matlab verwenden müssen).Antworten:
Die kurze Antwort: Die integrierte Funktion
arrayfun
macht genau das, was Ihremap
Funktion für numerische Arrays macht:Es gibt zwei weitere integrierte Funktionen, die sich ähnlich verhalten:
cellfun
(die auf Elemente von Zellenarrays angewendet werden) undstructfun
(die auf jedem Feld einer Struktur ausgeführt werden).Diese Funktionen sind jedoch häufig nicht erforderlich, wenn Sie die Vektorisierung nutzen, insbesondere mit elementweisen arithmetischen Operatoren . Für das von Ihnen angegebene Beispiel wäre eine vektorisierte Lösung:
Einige Operationen werden automatisch über Elemente hinweg ausgeführt (z. B. das Hinzufügen eines Skalarwerts zu einem Vektor), während andere Operatoren eine spezielle Syntax für die elementweise Operation haben (gekennzeichnet durch a
.
vor dem Operator). Viele in MATLAB integrierte Funktionen sind so konzipiert, dass sie Vektor- und Matrixargumente mit elementweisen Operationen verarbeiten (häufig auf eine bestimmte Dimension angewendet, wie z. B.sum
undmean
), und erfordern daher keine Kartenfunktionen.Zusammenfassend gibt es hier verschiedene Möglichkeiten, um jedes Element in einem Array zu quadrieren:
Für eine so einfache Operation ist Option 1 natürlich die sinnvollste (und effizienteste) Wahl.
quelle
Neben vektor- und elementweisen Operationen gibt es auch
cellfun
Funktionen zum Zuordnen von Funktionen über Zellenarrays. Beispielsweise:Wenn 'UniformOutput' true ist (oder nicht bereitgestellt wird), wird versucht, die Ergebnisse entsprechend den Abmessungen des Zellenarrays zu verketten
quelle
Eine ziemlich einfache Lösung unter Verwendung der Vektorisierung von Matlab wäre:
Nun tippen
kehrt zurück
c (b) ist eine Referenz auf einen Vektor der Größe 5 mit den Elementen von c an den durch b gegebenen Indizes. Wenn Sie nun diesem Referenzvektor Werte zuweisen, werden die ursprünglichen Werte in c überschrieben, da c (b) Verweise auf die Werte in c und keine Kopien enthält.
quelle
Es scheint, dass das eingebaute Arrayfun nicht funktioniert, wenn das benötigte Ergebnis ein Funktionsarray ist: zB: map (@ (x) [xx ^ 2 x ^ 3], 1: 10)
leichte Mods unten machen diese Arbeit besser:
quelle
..., 'UniformOutput', false);
, um eine Zellenarray-Ausgabe zu erstellen, die Ihre Arrays enthält, und sie dann formatieren und kombinieren, wie Sie möchten, zu einem Nicht-Zellenarray.Wenn matlab keine integrierte Kartenfunktion hat, kann dies an Effizienzüberlegungen liegen. In Ihrer Implementierung verwenden Sie eine Schleife, um die Elemente der Liste zu durchlaufen, was in der Matlab-Welt im Allgemeinen verpönt ist. Die meisten integrierten Matlab-Funktionen sind "vektorisiert", dh es ist effizienter, eine Funktion für ein gesamtes Array aufzurufen, als sie selbst zu durchlaufen und die Funktion für jedes Element aufzurufen.
Mit anderen Worten, dies
ist viel schneller als das
unter der Annahme Ihrer Definition der Karte.
quelle
Sie brauchen nicht,
map
da eine Skalarfunktion, die auf eine Werteliste angewendet wird, auf jeden der Werte angewendet wird und daher ähnlich funktioniert wiemap
. Probier's einfachIn Ihrem speziellen Fall könnten Sie sogar schreiben
quelle
Das Vektorisieren der Lösung wie in den vorherigen Antworten beschrieben ist wahrscheinlich die beste Lösung für die Geschwindigkeit. Vektorisieren ist auch sehr Matlaby und fühlt sich gut an.
Damit hat Matlab jetzt eine Map-Container-Klasse.
Siehe http://www.mathworks.com/help/matlab/map-containers.html
quelle
cellfun
et al., Nicht von Hash-Tabellen oder Schlüssel-Wert-Paaren.