Kartenfunktion in MATLAB?
Ich bin ein wenig überrascht, dass MATLAB nicht über eine Map-Funktion, so dass ich gehackt einen selber zusammen, da es etwas ich kann nicht ohne Leben. Gibt es eine bessere version gibt? Gibt es etwas-standard-funktionale Programmierung-Bibliothek für MATLAB gibt, 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 z.B.
map( @(x)x^2,1:10)
Kommentar zu dem Problem - Öffnen
Lektion #1 gehen aus anderen Sprachen Matlab: keine for-Schleifen, Sie sind ein paar Größenordnungen langsamer als ein Vektorgrafik-Lösung.
Was ist Rekursion?
Mit der Einführung der JIT -, for-Schleifen nehmen Sie nicht die Strafe, die Sie einst Taten.
@CookieOfFortune ich denke, das ist nicht mehr wahr...
@AnderBiguri ich glaube, Sie haben Hinzugefügt einige Verbesserungen, aber es ist noch viel langsamer.
InformationsquelleAutor der Frage | 2009-06-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die kurze Antwort lautet: die eingebaute Funktion
arrayfun
genau das tut, was Ihrmap
Funktion für numerische arrays:Gibt es zwei eingebaute Funktionen, die sich ähnlich Verhalten:
cellfun
(die arbeitet auf die Elemente des cell-arrays) undstructfun
(die arbeitet auf jedem Feld eine Struktur).Jedoch, diese Funktionen sind oft nicht notwendig, wenn Sie die Vorteile der Vektorisierung, speziell mit Hilfe von element-wise arithmetische Operatoren. Für das Beispiel, das Sie Gaben, eine vektorisierte Lösung wäre:
Einige Vorgänge werden automatisch in Elemente (wie das hinzufügen eines skalaren Wert in einen Vektor), während andere Operatoren haben eine spezielle syntax (element-wise-Betrieb (gekennzeichnet durch ein
.
vor dem operator). Viele built-in-Funktionen in MATLAB sind ausgelegt für den Betrieb auf Vektor-und matrix-Argumente mithilfe von element-Weise Operationen (oft angewendet, um eine bestimmte dimension, wieSumme
undbedeuten
zum Beispiel), und damit nicht erforderlich-Funktionen auf der Karte.Zusammenzufassen, hier sind einige verschiedene Möglichkeiten, um Platz jedes element in einem array:
Natürlich, für solch einen einfachen Vorgang, option #1 ist die vernünftige (und effiziente) Auswahl.
InformationsquelleAutor der Antwort gnovice
Zusätzlich zu Vektor-und element-Weise Operationen, gibt es auch
cellfun
für mapping-Funktionen, die über cell-arrays. Zum Beispiel:Wenn 'UniformOutput' ist wahr (oder nicht angegeben), und es wird versuchen, verketten Sie die Ergebnisse nach den Abmessungen des cell-array, so
InformationsquelleAutor der Antwort kwatford
Eine ziemlich einfache Lösung, mit Hilfe von Matlab die Vektorisierung wäre:
Jetzt Tippen
gibt
c( b ) ist eine Referenz auf einen Vektor der Größe 5, wobei die Elemente von c in den Indizes gegeben durch b. Nun, wenn Sie assing Werte zu dieser Referenz Vektor der ursprünglichen Werte in c überschrieben werden, da c( b ) enthält Verweise auf die Werte in c und keine Kopien.
InformationsquelleAutor der Antwort doc
Wenn matlab nicht haben einen eingebauten map-Funktion, könnte es sein, weil der Effizienz-Erwägungen. In Ihrer Umsetzung sind Sie mit einer Schleife zur Iteration über die Elemente der Liste, die in der Regel verpönt, in die matlab-Welt. Die meisten eingebauten matlab-Funktionen sind "vektorisiert", ich. e. es ist effizienter, um eine Funktion aufzurufen, die in einem array, als Durchlaufen Sie es selbst und rufen Sie die Funktion für jedes element.
In anderen Worten, diese
ist viel schneller als dies
vorausgesetzt, Ihre definition gekennzeichnet.
InformationsquelleAutor der Antwort Dima
Scheint es, dass die built-in arrayfun funktioniert nicht, wenn das Ergebnis benötigt wird, eine array-Funktion:
zB:
Karte(@(x)[x-x^2 x^3],1:10)
leichte mods unter sich diese Arbeit machen besser:
InformationsquelleAutor der Antwort Foo Bara
Brauchen Sie nicht
map
da ein Skalar-Funktion, die angewendet auf eine Liste von Werten angewendet wird, um jeden der Werte und damit funktioniert ähnlich wiemap
. Versuchen Sie einfachIn Ihrem speziellen Fall könnte man auch schreiben
InformationsquelleAutor der Antwort Dario
Vektorisieren die Lösung, wie beschrieben in den vorherigen Antworten ist das wohl die beste Lösung für die Geschwindigkeit. Vektorisieren ist auch sehr Matlaby und fühlt sich gut an.
Mit sagte, dass Matlab kann nun ein Map-container-Klasse.
Sehen http://www.mathworks.com/help/matlab/map-containers.html
InformationsquelleAutor der Antwort TallBrianL