» A=rand(2)
A =
0.8214 0.6154
0.4447 0.7919
» B=exp(A)
B =
2.2737 1.8505
1.5600 2.2077
Genauso kann man natürlich vorgehen, wenn eine Funktion nicht auf
R, sondern auf einer anderen skalaren Wertemenge definiert ist, etwa C,
der Menge der komplexen Zahlen oder der Menge der logischen Werte.
Beispiele solcher Funktionen sind:
» A=randn(2)
A =
-0.4326 0.1253
-1.6656 0.2877
» abs(A)
ans =
0.4326 0.1253
1.6656 0.2877
» sqrt(A)
ans =
0 + 0.6577i 0.3540
0 + 1.2906i 0.5364
» img(A)
ans =
0.6577 0.0
1.2906 0.0
sin cos tan cot log fix
Man kann diese Erweiterung z.B. bei der graphischen Darstellung der Funktionswerte benutzen.
» t=0.0:0.01:2*pi; » plot(t,sin(t))erzeugt die folgende Darstellung des Graphen der Sinus-Funktion:
» A=fix(randn(5))
A =
0 0 -2 0 -1
0 0 0 -1 1
0 0 0 0 0
0 0 0 0 -1
0 -1 0 -1 0
» -A
ans =
0 0 2 0 1
0 0 0 1 -1
0 0 0 0 0
0 0 0 0 1
0 1 0 1 0
Arithmetische Operationen mit zwei Operanden werden in Matlab analog
für zwei Felder definiert, sofern diese gleiche Gestalt haben.
» [X,Y] = meshgrid(-8:0.5:+8); » R = sqrt(X.^2+Y.^2)+eps; » Z = sin(R)./R; » mesh(X,Y,Z)erzeugt die folgende Darstellung einer Funktionsfläche:
Der Funktionsaufruf meshgrid(-8:0.5:+8) erzeugt dabei zwei 33*33 Matrizen mit x- bzw y-Koordinaten, die jeweils von -8.0 bis +8.0 laufen, in X haben alle Zeilen, in Y alle Spalten dieselben Werte. Mit den beiden nächsten Anweisungen werden elementweise die zugehöhrigen Z-Koordinaten berechnet.
Bei der graphischen Darstellung von Funktionen benötigt man gelegentlich unregelmäßig gestaltete Koordinatenfelder, etwa solche von der Gestalt eines L. Matlab kennt aber, wie die meisten anderen Programmiersprachen auch, nur Felder, bei denen die Länge einer Dimension immer unabhängig von den Index-Werten in den anderen Dimensionen ist. Bei zweidimensionalen Feldern also nur solche mit rechteckiger Gestalt. Spezielle Effekte sind aber mit Hilfe von NaN-Werten möglich.
Wir hatten gesagt, daß arithmetische Operationen mit zwei Operanden
nur dann elementweise fü Felder definiert sind, wenn diese dieselbe
Gestalt haben. Jedem Feld ist in Matlab intern ein eindimensionales
Feld zugeordnet, für zwei solche Felder gilt dies natürlich auch.
Logische Operationen mit einem Operanden, also das logische nicht, kann
man problemlos elementweise auf Feldern definieren. Logische Operationen
mit zwei Operanden wieder nur dann, wenn gleiche Gestalt vorliegt.
Beispiel 7.2
» [X,Y] = meshgrid(-8:0.5:+8);
» R = sqrt(X.^2+Y.^2)+eps;
» Z = sin(R)./R;
» Z(1:17,1:17) = NaN;
» colormap hot
» surf(X,Y,Z)
» shading interp
berechnet zunächst dieselben Funktionswerte wie in Beispiel 6.5,
danach werden jedoch die Werte von Z(1:17,1:17) gleich NaN
gesetzt. Die Matlab Graphik-Prozeduren stellen solche Werte
nicht dar, was dazu führt, daß die Oberflächhe
aufgeschnitten wird und einen Blick in das Innere erlaubt.
Mit colormap hot und shading interp wird die Darstellung
der Funktionsoberfläche beeinflusst.
» A=rand(2,2,2)
A(:,:,1) =
0.9501 0.6068
0.2311 0.4860
A(:,:,2) =
0.8913 0.4565
0.7621 0.0185
» B=rand(2,4)
B =
0.8214 0.6154 0.9218 0.1763
0.4447 0.7919 0.7382 0.4057
» C=A(:)+B(:)
C =
1.7715
0.6758
1.2223
1.2779
1.8131
1.5003
0.6327
» A=eye(3)
A =
1 0 0
0 1 0
0 0 1
» B=~A
B =
0 1 1
1 0 1
1 1 0
» C=A|B
C =
1 1 1
1 1 1
1 1 1
» D=A&B
D =
0 0 0
0 0 0
0 0 0
Vergleichsausoperationen für arithmetische Werte kann man elementweise
für Felder definieren, wenn diese dieselbe Gestalt haben.
» A=rand(3)
A =
0.9501 0.4860 0.4565
0.2311 0.8913 0.0185
0.6068 0.7621 0.8214
» B=randn(3)
B =
-0.4326 0.2877 1.1892
-1.6656 -1.1465 -0.0376
0.1253 1.1909 0.3273
» C=A
C =
0 0 1
0 0 0
0 1 0
8. Skalare Expansion
Für Operationen mit zwei Feld-Operanden haben wir bisher immer
vorausgesetzt, daß die Operanden dieselbe Gestalt haben. Operationen
wie die Bildung des fünffachen eines Vektors, die in der Mathematik
gebräuchlich sind, lassen sich damit nur umständlich formulieren.
» L=1:8
L =
1 2 3 4 5 6 7 8
» M=[5 5 5 5 5 5 5 5]
M =
5 5 5 5 5 5 5 5
» M.*L
ans =
5 10 15 20 25 30 35 40
Matlab lä&szlt;t deshalb auch Operationen mit einem skalaren und einem
Feldoperanden zu. Der skalare Operand wird dann bei Bedarf durch ein Feld
ersetzt, das seine Gestalt vom anderen Operanden erbt, seine Elementwerte
aber vom Skalar, letzteres bedeutet insbesondere, daß alle Elemente
denselben Wert haben. Obiges Beispiel läßt sich also auch wie
folgt schreiben:
» L=1:8
L =
1 2 3 4 5 6 7 8
» 5.*L
ans =
5 10 15 20 25 30 35 40
Man bezeichnet diesen Ersetzungs-Vorgang als skalare Expansion, sie
tritt zwar vorwiegend im Zusammenhang mit arithmetischen Ausdrücken auf,
ist aber nicht auf diese beschränkt.
» M=[2 4; 10 5];
» N=2*M+10
N =
14 18
30 20
» B=2*(1:3)
B =
2 4 6
» C=B<5
C =
1 1 0
Beispiel 8.1:
Für die Funktion Z(omega) = 1./(2i*omega + 1) soll imag(Z) gegen
real(Z) gezeichnet werden. Dieser Graph taucht in der Regelungstheorie
als Ortskurve zu bestimmten Differentialgleichungen auf und beschreibt
Eigenschaften der Lösung dieser Gleichung.
Bei der Darstellung dieser Ortskurve taucht das Problem auf, daß
das Parameterfeld Omega am Anfang viel zu grob, am Ende unnötig
fein ist. Wir wählen deshalb ein Parameterfeld, bei dem die
Parameterwerte am Anfang näher zusammenliegen als am Ende:
» omega=0.001:0.001:0.1;
» omega=[ 0 omega 0.1+10*omega 1+100*omega 10+1000*omega ];
» Z=1./(2i*omega+1);
» plot(real(Z),imag(Z))

Vektorweise arbeitende Funktionen
Bei einer Funktion f:R->R ist die Ausweitung des Definitionsbereiches
auf Rn oder höherdimensionale reelle Felder durch
elementweise Funktionsberechnung relativ naheliegend.
Aus den Anwendungen kennen wir aber auch Funktionen f:Rn->R,
die einen reellen Vektor als Argument erwarten und einen skalaren Funktionswert
liefern, man denke z.B. an die Mittelwertbildung. Was soll man unter dem
Mittelwert einer Matrix oder eines höherdimensionalen Feldes verstehen?
Eine Möglichkeit ist natürlich die, die Gestalt des Feldes zu
ignorieren und den Mittelwert aller Elemente zu berechnen, das kann man in
Matlab auch machen, allerdings mit Hilfe des internen Vektors, der dem
Feld zugeordnet ist.
» Messreihe=rand(5,2)
Messreihe =
0.4447 0.1763
0.6154 0.4057
0.7919 0.9355
0.9218 0.9169
0.7382 0.4103
» Mittel2S=mean(Messreihe(:))
Mittel2S =
0.6357
Eine andere Möglichkeit ist aber die, die vorliegende Gestalt des
Meßwertfeldes zu berücksichtigen und die Mittelwerte spalten-
oder reihenweise zu bilden. Matlab geht diesen Weg, im Falle einer Matrix,
von n > 1 Reihen und m Spalten wird der Mittelwert spaltenweise
ermittelt. Das heißt Matlab interpretiert die Matrix als Reihe von
Vektoren der Länge n. Als Funktionswert liefert es dann eine genauso
lange Reihe von skalaren Werten.
» Mittel1R=mean(A)
Mittel1S =
0.6331 0.7037
Allgemein gilt für mean und andere Vektoren verarbeitende Funktionen,
daß jedes zwei oder höherdimensionale Feld M, dessen 1. Dimension
eine Länge > 1 hat, als Feld von Vektoren aufgefßt wird.
Ein n*m*p Feld wird also als m*p Feld von n-Vektoren aufgefaßt. Der
Funktionswert wird über jeden einzelnen Vektor gebildet. Der
Funktionswert ist ein Feld derselben Dimension wie das Argument, die Länge
der 1. Dimension ist 1, die anderen Dimensionen haben dieselbe Länge
wie beim Argument.
» A=randn(4,3,2)
A(:,:,1) =
-0.4326 -1.1465 0.3273
-1.6656 1.1909 0.1746
0.1253 1.1892 -0.1867
0.2877 -0.0376 0.7258
A(:,:,2) =
-0.5883 1.0668 0.2944
2.1832 0.0593 -1.3362
-0.1364 -0.0956 0.7143
0.1139 -0.8323 1.6236
» B=mean(A)
B(:,:,1) =
-0.4213 0.2990 0.2603
B(:,:,2) =
0.3931 0.0495 0.3240
» size(B)
ans =
1 3 2
Unbrauchbar ist dieses Vorgehen natürlich bei Feldern, deren 1.
Dimension die Länge 1 hat, es liefert dann einfach das Argumentfeld
als Funktionswert. Matlab ignoriert daher Dimensionen der Länge 1
und bildet den Mittelwert über der 1. Demsion des Argumentfeldes,
dessen Länge > 1 ist. Ist eine solche Dimension nicht vorhanden,
so wird als Funktionswert eine 1*1 Matrix geliefert.
» C=mean(B)
C(:,:,1) =
0.0460
C(:,:,2) =
0.2555
» size(C)
ans =
1 1 2
» D=mean(C)
D =
0.1508
» size(D)
ans =
1 1
Das angegebene Verhalten ist in der Anwendung wesentlich weniger
kompliziert als in der Beschreibung, das Ignorieren von Dimensionen
der Läge 1 erlaubt insbesondere eine sinnvolle Schachtelung von
Aufrufen solcher Funktionen.
Die Funktion max( ) gehört zur selben Funktionsklasse wie mean( ),
max( ) liefert den maximalen Wert eines Vektors. Bei einem 3-dimensionalen
5*4*2 Feld, also einem Feld mit 5 Reihen, 4 Spalten und 2 Ebenen, kann
man den größten Elementwert also einmal mit max(A(:)) oder
auch mit max(max(max(A))) ermitteln.
» A=rand(5,4,2)
A(:,:,1) =
0.9218 0.9169 0.8132 0.6038
0.7382 0.4103 0.0099 0.2722
0.1763 0.8936 0.1389 0.1988
0.4057 0.0579 0.2028 0.0153
0.9355 0.3529 0.1987 0.7468
A(:,:,2) =
0.4451 0.5252 0.6813 0.4289
0.9318 0.2026 0.3795 0.3046
0.4660 0.6721 0.8318 0.1897
0.4186 0.8381 0.5028 0.1934
0.8462 0.0196 0.7095 0.6822
» max(A(:))
ans =
0.9355
» max(max(max(A)))
ans =
0.9355
Weitere Funktionen dieser Klasse sind:
A =
1 1 0 0
1 1 0 0
0 0 0 0
» all(A)
ans =
0 0 0 0
» any(A)
ans =
1 1 0 0
» all(all(A))
ans =
0
Funktionen, die üblicherweise Vektoren als Argumente erwarten und
andere Vektoren als Funktionswerte liefern, werden völlig analog
behandelt, der Funktionswert hat jetzt aber wieder dieselbe Gestalt wie
das Argumentfeld. Wir erwähnen hier nur die sort( )-Funktion.
» A=rand(3,3)
A =
0.3028 0.6979 0.8537
0.5417 0.3784 0.5936
0.1509 0.8600 0.4966
» sort(A)
ans =
0.1509 0.3784 0.4966
0.3028 0.6979 0.5936
0.5417 0.8600 0.8537
Auf andere Funktionen, die Felder als Argumente akzeptieren, gehen wir
später bei speziellen Anwendungen ein.