This is documentation for Mathematica 4, which was
based on an earlier version of the Wolfram Language.
View current documentation (Version 11.1)

 Documentation /  Mathematica /  Das Mathematica Buch /  Die Prinzipien von Mathematica /  Funktionaloperationen /

Fortgeschrittenes Thema: Arbeiten mit OperatorenFolgen

2.2.10 Strukturoperationen

Mathematica verfügt über einige mächtige Primitiven zur Strukturänderung von Ausdrücken. Mit diesen Primitiven können einerseits mathematische Eigenschaften wie Assoziativität und Distributivität implementiert werden und andererseits bieten sie die Grundlage für knappe und effiziente Programme.

Dieser Abschnitt beschreibt verschiedene Operationen, die Sie explizit auf Ausdrücke anwenden können. In Abschnitt 2.5.3 wird beschrieben, wie einige dieser Operationen durch Zuweisung geeigneter Attribute automatisch auf alle Ausdrücke mit einem bestimmten Kopf angewendet werden können.

Mit der Mathematica-Funktion Sort[ausdr] lassen sich nicht nur Elemente von Listen, sondern auch von Ausdrücken mit einem beliebigen Kopf sortieren. So können Sie die mathematischen Eigenschaften der Kommutativität oder Symmetrie für beliebige Funktionen implementieren.

Mit Sort lassen sich die Argumente jeder Funktion in eine Standard- Reihenfolge bringen.

In[1]:= Sort[ f[c, a, b] ]

Out[1]=

In die Reihenfolge sortieren

Das zweite Argument in Sort ist eine Funktion, die ermittelt, ob Paare in der richtigen Reihenfolge stehen. Dies sortiert Zahlen in absteigender Reihenfolge.

In[2]:= Sort[ {5, 1, 8, 2}, (#2 < #1)& ]

Out[2]=

Dieses Sortierkriterium stellt Elemente, die nicht von x abhängen, vor jene, die von x abhängen.

In[3]:= Sort[ {x^2, y, x+y, y-2}, FreeQ[#1, x]& ]

Out[3]=

Einebnung von Ausdrücken

Flatten beseitigt verschachteltes Auftreten einer Funktion.

In[4]:= Flatten[ f[a, f[b, c], f[f[d]]] ]

Out[4]=

Mit Flatten lassen sich Folgen von Elementen in Listen oder andere Ausdrücke „einreihen".

In[5]:= Flatten[ {a, f[b, c], f[a, b, d]}, 1, f ]

Out[5]=

Mit Flatten können Sie die mathematische Eigenschaft der Assoziativität implementieren. Die Funktion Distribute ermöglicht Ihnen die Implementierung solcher Eigenschaften wie Distributivität und Linearität.

Anwendung von Distributivgesetzen

Dies „distributiert" f bezüglich a + b.

In[6]:= Distribute[ f[a + b] ]

Out[6]=

Hier ist ein etwas komplizierteres Beispiel.

In[7]:= Distribute[ f[a + b, c + d] ]

Out[7]=

Im allgemeinen kann, wenn f bezüglich Plus distributiv ist, ein Ausdruck wie f[a + b] in f[a] + f[b] „entwickelt" werden. Die Funktion Expand vollzieht diese Art der Entwicklung für algebraische Standardoperatoren wie Times. Mit Distribute können Sie dieselbe Art der Entwicklung für beliebige Operatoren ausführen.

Expand nutzt die Distributivität von Times bezüglich Plus aus, um algebraische Entwicklungen durchzuführen.

In[8]:= Expand[ (a + b) (c + d) ]

Out[8]=

Dies wendet die Distributivität bezüglich Listen statt bei Summen an. Das Ergebnis enthält alle möglichen Paare von Argumenten.

In[9]:= Distribute[ f[{a, b}, {c, d}], List ]

Out[9]=

Dies wendet das Distributivgesetz bezüglich Listen an, aber nur, wenn der Kopf des ganzen Ausdrucks f ist.

In[10]:= Distribute[ f[{a, b}, {c, d}], List, f ]

Out[10]=

Dies wendet das Distributivgesetz bezüglich Listen an, aber nur, wenn der Kopf des ganzen Ausdrucks f ist. Im Ergebnis wird gp anstelle von List und fp anstelle von f verwendet.

In[11]:= Distribute[ f[{a, b}, {c, d}], List, f, gp, fp ]

Out[11]=

Verwandt mit Distribute ist die Funktion Thread. Im Grunde wendet Thread eine Funktion parallel auf alle Elemente einer Liste oder eines Ausdrucks an.

Funktionen für das Verteilen über Ausdrücke

Hier ist eine Funktion, deren Argumente Listen sind.

In[12]:= f[{a1, a2}, {b1, b2}]

Out[12]=

Thread wendet die Funktion „parallel" auf jedes Element der Listen an.

In[13]:= Thread[%]

Out[13]=

Argumente, die keine Listen sind, werden wiederholt.

In[14]:= Thread[ f[{a1, a2}, {b1, b2}, c, d] ]

Out[14]=

Wie in Abschnitt 1.8.1 erwähnt und ausführlicher in Abschnitt 2.5.3 beschrieben wird, haben viele eingebaute Mathematica-Funktionen die Eigenschaft „listbar", so daß sie automatisch über alle Listen verteilt werden, die als Argumente auftreten.

Eingebaute mathematische Funktionen wie Log sind listbar, so daß sie automatisch über alle Listen verteilt werden.

In[15]:= Log[{a, b, c}]

Out[15]=

Jedoch wird Log nicht automatisch über Gleichungen verteilt.

In[16]:= Log[x == y]

Out[16]=

Mit Thread können Sie Funktionen auf beide Seiten einer Gleichung anwenden.

In[17]:= Thread[%, Equal]

Out[17]=

Verallgemeinerte äußere und innere Produkte

Outer[f, , ] nimmt alle möglichen Kombinationen von Elementen der und und kombiniert sie mit f. Outer kann als Verallgemeinerung eines kartesischen Produktes für Tensoren betrachtet werden (siehe Abschnitt 3.7.11).

Outer bildet alle möglichen Kombinationen von Elementen und wendet f auf sie an.

In[18]:= Outer[f, {a, b}, {1, 2, 3}]

Out[18]=

Hier erzeugt Outer eine Boolesche untere Dreiecksmatrix.

In[19]:= Outer[ Greater, {1, 2, 3}, {1, 2, 3} ]

Out[19]=

Sie können Outer auf jede Folge von Ausdrücken mit demselben Kopf anwenden.

In[20]:= Outer[ g, f[a, b], f[c, d] ]

Out[20]=

Outer konstruiert wie Distribute alle möglichen Kombinationen von Elementen. Auf der anderen Seite konstruiert Inner so wie Thread nur Kombinationen solcher Elemente, die in den Ausdrücken, auf die es wirkt, einander entsprechende Positionen haben.

Hier ist eine durch Inner aufgebaute Struktur.

In[21]:= Inner[f, {a, b}, {c, d}, g]

Out[21]=

Inner ist eine Verallgemeinerung von Dot.

In[22]:= Inner[Times, {a, b}, {c, d}, Plus]

Out[22]=

Fortgeschrittenes Thema: Arbeiten mit OperatorenFolgen