Technische Artikel

Tipps und Tricks – Kombinieren von Funktionen mittels anonymer Funktionen

Von Loren Shure, MathWorks


Mit anonymen Funktionen kann man einfache Funktionen als Variablen erzeugen, ohne dabei die Funktionen selbst als Datei speichern zu müssen. Durch Kombination mehrerer anonymer Funktionen kann man zudem komplexe Ausdrücke konstruieren. Hier einige Beispiele für solche Kombinationen.

Komposition von Funktionen

In diesem Beispiel erzeugen wir eine einzelne Funktion, indem eine Funktion eine andere aufruft.

Angenommen, man möchte die Standardabweichung vom Mittelwert für einige Daten berechnen – etwa mit std(mean(x)). Man kann dazu einzelne anonyme Funktionen für die Berechnung des Mittelwerts und die Standardabweichung konstruieren und anschließend kombinieren:

f = @mean;
g = @std;
fCompg = @(x) g(f(x));

Um sicherzustellen, dass diese Funktionskomposition wie erwartet funktioniert, werten wir die erste Funktion aus und verwenden das Ergebnis als Eingabe für die zweite. Dann überprüfen wir, ob dieser zweistufige Prozess dasselbe Ergebnis hat wie die Funktionskomposition:

x = rand(10,4);
fx = f(x);
gfx = g(fx);
gfx2 = fCompg(x);
gfsEqual = isequal(gfx,gfx2)
gfsEqual = 1

Wir könnten stattdessen auch einen verallgemeinerten Kompositionsoperator g(f) erstellen und diesen verwenden.

compose = @(g,f)@(x)g(f(x))
fCompg2 = compose(g,f)
gfcx = fCompg2(x);
gfcEqual = isequal(gfx, gfcx)
gfcEqual = 1 

Komposition bedingter Funktionen

Sehen wir uns nun eine kompliziertere Komposition an. Angenommen wir möchten folgenden Ausdruck berechnen: y = sin(x) – mean(x) + 3; wollen aber nicht jedes Mal den Mittelwert subtrahieren oder 3 addieren. Dazu erzeugen wir dynamisch eine Funktion zur Berechnung von y, die nur dann den Mittelwert subtrahiert oder 3 addiert, wenn wir es wollen.

Zunächst erzeugen wir Function Handles, die jeweils den Sinus berechnen, den Mittelwert subtrahieren und 3 addieren:

x = 0:pi/100:pi/2;
myfunc = @sin;
meanValue = @mean;
three = @(x) 3;

Während die Variable, die das jeweilige Function Handle enthält, ihren Namen behält, kann sich die dadurch beschriebene Funktion ändern. Dieses Beispiel funktioniert im Übrigen nur, wenn x ein Zeilen- oder Spaltenvektor ist – bei mehrdimensionalen Daten wären die Ausdrücke komplexer und bsxfun wäre zu verwenden.

Diese Funktionen werden nun konditional kombiniert. Nehmen wir der Einfachheit halber an, dass wir 3 addieren, aber den Mittelwert nicht subtrahieren möchten. In einem realistischeren Beispiel würde man mittels logischer Vergleiche ermitteln, welche Funktionen anzuwenden sind:

if false
myfunc = @(x) myfunc(x) - meanValue(x);
end
if true
myfunc = @(x) myfunc(x) + three(x);
end

Probieren wir das mit den zuvor erzeugten Daten x aus:

mf3mean = myfunc(x);

Ganz egal, welche Funktionen man mit der ursprünglichen Funktion kombiniert: Es wird immer ein Function Handle ausgewertet. Auf diese Weise kann man zusätzliche Informationen definieren, während man eine geeignete Funktion für die gewünschten Berechnungen aufbaut.

Eine vielseitige Technik

Die Verwendung anonymer Funktionen ist eine äußerst vielseitige Methode, die für eine Vielzahl von Berechnungen – von einfachsten bis hin zu sehr komplizierten – nützlich sein kann. Vorgestellt wurden lediglich zwei Beispiele, die Palette der Möglichkeiten ist aber prinzipiell unbegrenzt.

Veröffentlicht 2011 - 91953v00

Eingesetzte Produkte

Weitere Informationen