>>gekennzeichnet.
skalar
als Skalar mit Wert 5.
Variablennamen, wie hier skalar
können beliebig
gewählt werden. Zur Wert-Zuweisung benutzt man den
Operator = .
>> skalar = 5
Matlab/Octave antwortet darauf mit:
skalar = 5
Will man diese Ausgabe unterdrücken, so kann
man dies mit einem Semikolon am Ende der Zeile
bewirken.
>> skalar = 5;
Ein Vektor ist eine Matrix, wobei eine Spalte bzw.
Reihe die Länge 1 besitzt.
Definiere Zeilenvektor zeilenVektor
der Länge 3:
>> zeilenVektor = [ 2 4 8 ]
Antwort von Matlab/Octave:
zeilenVektor = 2 4 8Optional kann man die Werte mit Kommas trennen.
>> zeilenVektor = [ 2, 4, 8 ]
Antwort von Matlab/Octave:
zeilenVektor = 2 4 8Will man einen Spalten-Vektoren definieren, so ersetzt man das Komma durch Semikolon: Definiere einen Spalten-Vektor
spaltenVektor der Länge 3:
>> spaltenVektor = [ 1; 3; 9 ]
spaltenVektor =
1
3
9
Hier schreibt Matlab/Octave die Antwort, wie gewünscht,
in verschiedene Zeilen, d.h. der Vektor besitzt
nur eine Spalte (Spaltenvektor).
Will man einen Spaltenvektor in einen Zeilenvektor
umformen, kann man dies folgendermaßen
bewerkstelligen:
>>spaltenVektor_1 = zeilenVektor'
spaltenVektor_1 =
2
4
8
Die Konvertierung von Zeilenvektoren in Spaltenvektoren
funktioniert analog.
>>zeilenVektor_1 = spaltenVektor'
zeilenVektor_1 =
1 3 9
Der Übergang zu echten Matrizen ist einfach:
>>Matrix_3x3 = [ 1, 2, 3; 4, 5, 6; 7, 8, 9 ] Matrix_3x3 = 1 2 3 4 5 6 7 8 9Auf die einzelnen Elemente kann durch Angabe der Indizes (beginnend mit 1) zugegriffen werden:
>>Matrix_3x3(2,3)
ans = 6
Hier wurde das Ergebnis nicht in einer
Variablen gespeichert.
Die Ausgabe erfolgt dann in ans
(für answer).
>>komplexeMatrix_3x2 = [ 1 + 3i, 2 + 5i; 3, 7i; 4 + 3i , 2]
komplexeMatrix_3x2 =
1 + 3i 2 + 5i
3 + 0i 0 + 7i
4 + 3i 2 + 0i
Matrizen lassen sich auch mit Hilfe des (.)- und
(')-Operators transponieren, bzw.
transponieren und konjugieren:
>>transponiertMatrix = komplexeMatrix_3x2.'
transponierteMatrix =
1 + 3i 3 + 0i 4 + 3i
2 + 5i 0 + 7i 2 + 0i
>>transponiertUndkonjugierteMatrix = komplexeMatrix_3x2'
transponiertUndkonjugierteMatrix =
1 - 3i 3 - 0i 4 - 3i
2 - 5i 0 - 7i 2 - 0i
>>zeichenFolge = ["eine ", "Zeichenfolge"]
zeichenFolge = eine Zeichenfolge
Intern speichert Matlab/Octave Zeichenfolgen
als Matrizen von Zeichen.
Das bedeutet, dass folgende Definition analog der obigen ist.
>>gleicheZeichenFolge = ["eine Zeichenfolge"]
gleicheZeichenFolge = eine Zeichenfolge
>>who
*** local user variables:
Matrix_3x3 skalar spaltenVektor_1 zeilenVektor
komplexeMatrix_3x2 spaltenVektor zeichenFolge zeilenVektor_1
Noch mehr Information, wie z.B. die Dimensionen der Matrizen, gibt es mit
>>whos *** local user variables: prot type rows cols name ==== ==== ==== ==== ==== rwd matrix 3 3 Matrix_3x3 rwd complex matrix 3 2 komplexeMatrix_3x2 rwd scalar 1 1 skalar rwd matrix 3 1 spaltenVektor rwd matrix 3 1 spaltenVektor_1 rwd string 1 25 zeichenFolge rwd matrix 1 3 zeilenVektor rwd matrix 1 3 zeilenVektor_1Variablen, die man nicht mehr benötigt, können mit clear gelöscht werden, z.B.
>>clear Matrix_3x3
Alle Variablen löscht man mit
>>clear all
>>A_2x3 = [1, 2, 3; 5, 6, 7]; >>B_3x3 = [9, 8, 7; 6, 5, 4; 3, 2, 1];Das Matrixprodukt zwischen A_2x3 und B_3x3 ist definiert:
>>A_2x3 * B_3x3 ans = 30 24 18 102 84 66Das Produkt zwischen B_3x3 und A_2x3 aber nicht! Also erhält man eine Fehlermeldung (hier unter Octave):
>>B_3x3 * A_2x3
error: operator *: nonconformant arguments (op1 is 3x3, op2 is 2x3)
error: evaluating binary operator `*' near line 68, column 7
Unter Matlab erhält man als Fehler:
Inner matrix dimensions must agree
>>A_2x3 = [1, 2, 3; 5, 6, 7];
>>C_2x3 = [1, 1, 2; 2, 3, 3];
>>A_2x3 .* C_2x3
ans =
1 2 6
10 18 21
Dagegen ist das Matrixprodukt
A_2x3 * C_2x3 nicht definiert.
>>B_3x3 = [9, 8, 7; 6, 5, 4; 3, 2, 1];
>>B_3x3^2
ans =
150 126 102
96 81 66
42 36 30
Die elementweise Potenzierung mit Hilfe
des Operators .^
dagegen ist eine
Feldoperation zwischen den einzelnen
Komponenten der Matrizen.
>>A_2x3 = [1, 2, 3; 5, 6, 7];
>>C_2x3 = [1, 1, 2; 2, 3, 3];
>>A_2x3 .^ C_2x3
ans =
1 2 9
25 216 343
>>d = [2, 1; 3, 4];
>>d^-1
ans =
0.80000 -0.20000
-0.60000 0.40000
Die Inversion kann auch mit Hilfe der Funktion
inv(argument) ausgeführt werden.
>>e = [1, 3; 2, 3]; >>inv(e) ans = -1.00000 1.00000 0.66667 -0.33333Die rechte Division d/e entspricht d * e^-1:
>> d * e^-1 ans = -1.33333 1.66667 -0.33333 1.66667Direkt:
>>d/e ans = -1.33333 1.66667 -0.33333 1.66667Und die linke Division d\e, die d^-1 * e entspricht.
>>d^-1 * e ans = 0.40000 1.80000 0.20000 -0.60000oder direkt:
>>d\e ans = 0.40000 1.80000 0.20000 -0.60000Mit Hilfe der Inversion bzw. Division lassen sich lineare Gleichungssysteme lösen. Diese lassen sich als Matrix-Vektor Gleichung schreiben. (Zur allgemeinen Lösbarkeit solcher linearen Gleichungssysteme vgl. Lehrbücher der linearen Algebra).
>> A = [1, 3; 2, 3]; >> y = [1; 3]; >> x x = 2.00000 -0.33333Überprüfung:
>>A * x ans = 1 3
>> a = [1, 3; 2, 3]; >> b = [1, 4; 3, 3]; >> a != b ans = 0 1 1 0Beispiel für einen Vergleich zwischen einer Matrix und einem Skalar:
>> c = 3;
>> a == c
ans =
0 1
0 1
Die wichtigsten logischen
(Feld-)Operatoren sind:
>>a = [0, 1; 0, 1];
>>b = [1, 0; 0, 1];
>>xor(a,b)
ans =
1 1
0 0
>>a & b
ans =
0 0
0 1
>>matrix = [1, 2 , 3; 4, 5, 6]; >>matrix = [matrix; 7, 8, 9] ans = 1 2 3 4 5 6 7 8 9oder um eine weitere Spalte :
>> matrix = [ matrix, [10; 11; 12] ] matrix = 1 2 3 10 4 5 6 11 7 8 9 12Zum Löschen der Zeilen oder Spalten muss man diese mit einem leeren Vektor [] überschreiben. Zur Indizierung aller Elemente in der gewünschten Zeile oder Spalte benutzt man den Platzhalter : ,der alle Indizes anspricht.
>>matrix(:,1) = [] matrix = 2 3 10 5 6 11 8 9 12
>>matrix(2,:) = [] matrix = 2 3 10 8 9 12Auf die gleiche Weise kann man natürlich auch ganze Zeilen und Spalten auf einmal mit neuen Werten belegen:
>>matrix(:,2) = [1; 2] matrix = 2 1 10 8 2 12Ein Vektor lässt sich mit konstantem Inkrement automatisch erzeugen: (Startwert: Inkrement: maximaler Endwert)
>>vector = (-0.5:0.3:0.5)
vector =
-0.50000 -0.20000 0.10000 0.40000
Ein Spalten-Vektor:
>>vector = (-1:0.5:1)' vector = -1.00000 -0.50000 0.00000 0.50000 1.00000Slicing, das sind Ausschnitte aus Vektoren, kann man ebenfalls direkt erhalten:
vektor(m:n) ist das Slice des Vektors
vektor vom m-ten bis zum n-ten Eintrag:
>>vector(3:5)
ans =
0.00000
0.50000
1.00000
Bei Matrizen erhält man so Submatrizen:
>>vector = (1:0.1:1.5); >>matrix = [vector ; vector * 2; vector * 3 ] matrix = 1.0000 1.1000 1.2000 1.3000 1.4000 1.5000 2.0000 2.2000 2.4000 2.6000 2.8000 3.0000 3.0000 3.3000 3.6000 3.9000 4.2000 4.5000 >>matrix(2:3, 2:4) ans = 2.2000 2.4000 2.6000 3.3000 3.6000 3.9000
pi, e
help function, wobei function
für die Funktion steht, zu der man Hilfe benötigt.
help
ergibt eine Übersicht über Matlab/Octave.
Probieren Sie es aus!
>>a = ( 0 : pi/5 : 2 * pi)' >>b = sin(a) b = 0.00000 0.58779 0.95106 0.95106 0.58779 0.00000 -0.58779 -0.95106 -0.95106 -0.58779 -0.00000
length(v) gibt die Länge des
Vektors vector zurück.
size(matrix) gibt die Anzahl der
Zeilen und Spalten der Matrix matrix
als Zeilenvektor [Zeilen, Spalten] zurück.
eye(m,n) erzeugt eine m x n Matrix mit
1-ern auf der Hauptdiagonalen.
zeros(m,n) erzeugt eine Nullmatrix.
ones(m,n) erzeugt eine Matrix, deren Elemente gleich 1 sind.
rand(m,n) erzeugt eine
Zufallsmatrix mit gleichverteilten Einträgen
[0,1[.
Beispiel:
>>eye(3,3) ans = 1 0 0 0 1 0 0 0 1
plot(x-Vektor, y-Vektor).
>>a = ( 0 : pi/20 : 2 * pi); >>plot(a, sin(a))Die Art, wie der Graph geplottet werden soll, wird duch einen dritten Parameter eingestellt (durchgezogene Linien, Kreise, gepunktet, Beschriftung etc.) Beispiel Kreise (o) in rot(r) mit Graphbeschriftung "Sin":
>>a = ( 0 : pi/20 : 2 * pi); >>plot(a, sin(a), "or;Sin;")Auch lassen sich mehrere Funktionen gleichzeitig plotten:
>> plot (a, cos(a), ".;Cosinus;", a, sin(a), "+3;Sinus;");
Mehr Information zur Darstellung erhalten Sie über die Hilfe
help plot.
xlabel("gewünschte Beschriftung
der x-Achse") bzw.
ylabel("gewünschte Beschriftung
der y-Achse")
lassen sich die x- bzw. y-Achse dann beschriften.
title("gewünschte Überschrift")
wird die Überschrift gewählt.
figure lässt sich ein neuer Graph öffnen.
axis(x-min, x-max, y-min, y-max)
aus diesem ein Ausschnitt wählen.
>>xlabel("Zeit / s")
>>ylabel("Amplitude / V")
>>titel("Nur ein Beispiel")
>>figure
>>axis([1,4,-0.5, 1])
mesh erzeugt werden.
Versuchen Sie folgendes Beispiel vollständig
zu verstehen!
x = (-10:0.5:10);
y = (-10:0.5:10)';
v = ones(length(x),1);
xx = v * x;
yy = y * v';
f = cos( (0.2*xx).^2 + (0.4*yy).^2 ) .* exp( -0.04 * (xx.^2 + yy.^2) );
axis([-10, 10, -10, 10]);
mesh(x, y, f)
Das Erzeugen des x- bzw. y-"Grids"
(hier Variablenname xx bzw.
yy) lässt sich einfacher
mit der Hilfsfunktion [xx, yy] = meshgrid(x,y)
bewerkstelligen:
x = (-10:0.5:10);
y = (-10:0.5:10)';
[xx, yy] = meshgrid(x, y);
f = cos( (0.2*xx).^2 + (0.4*yy).^2 ) .* exp( -0.04 * (xx.^2 + yy.^2) );
axis([-10, 10, -10, 10]);
mesh(x, y, f)
>> save curWorkspacespeichert den Workspace im File curWorkspace ab.
>> load curWorkspacelädt den Workspace aus dem File curWorkspace wieder ein.
load
geladen und geschrieben werden. In der ascii-Datei müssen
die Daten allerdings im Matrixformat vorliegen.
Beispiel:
Es existiert die Datei bsp.txt im laufenden Verzeichnis:
chris@aristoteles:~> more bsp.txt 1 1 1 2 1 4 2 3Diese Datei kann mit Hilfe von
load
(standardmäßig in die Variable bsp) eingeladen werden,
falls man sich in Matlab/Octave im gleichen
Verzeichnis befindet oder das Verzeichnis im Suchpfad liegt
(siehe unten):
>>load bsp.txt
>>bsp
bsp =
1 1
1 2
1 4
2 3
Mit Hilfe von path kann man sich den
Suchpfad von Matlab/Octave anzeigen lassen.
>>path Octave's search path contains the following directories: . /usr/local/libexec/octave/2.1.57/site/oct/i686-pc-linux-gnu// /usr/local/libexec/octave/site/oct/api-v8/i686-pc-linux-gnu// /usr/local/libexec/octave/site/oct/i686-pc-linux-gnu// /usr/local/share/octave/2.1.57/site/m// /usr/local/share/octave/site/api-v8/m// /usr/local/share/octave/site/m// /usr/local/libexec/octave/2.1.57/oct/i686-pc-linux-gnu// /usr/local/share/octave/2.1.57/m//Mit Hilfe von
path(path, "/home/chris/myOctave")
lässt sich ein Verzeichnis zum Suchpfad hinzufügen.
help scriptname ausgegeben.
help name
überprüfen.
% Nur ein Beispiel % 3D-Plot % dies wird nicht mehr als Hilfe ausgegeben x = (-10:0.5:10); y = (-10:0.5:10)'; v = ones(length(x),1); X = v * x; Y = y * v'; f = cos( (0.2*X).^2 + (0.4*Y).^2 ) .* exp( -0.04 * (X.^2 + Y.^2) ); axis([-10, 10, -10, 10]); mesh(x, y, f)Steht dieses im Suchpfad, so kann man es und die korrespondierende Hilfe aufrufen:
>>myFirst
>>help myFirst
myFirst is the file: /home/chris/tmp/myFirst.m
Nur ein Beispiel
3D-Plot
Nach dem Aufruf sind die im Script-File definierten
Variablen im Workspace bekannt (im Gegensatz zu den
noch folgenden "selbstgeschriebenen"
Funktionen)
for-Schleife:
for i=0:-2:-10
printf("%d\n",i);
end
Die hier benutzte formatierte Ausgabe
ist analog zu der Sprache C.
Und die while-Schleife:
while a < A a=a+1; end
if a==0 error( "a ist 0!" ) else b=c/a; endDie switch-Anweisung:
switch pnorm case 1; sum(abs(v)) case inf; max(abs(v)) otherwise sqrt(v *v) end
function[Ausgabeparameter]= nameDerFunction(Eingabeparameter)
Ausgabeparameter steht hier für eine Liste von
Parametern, in denen Ergebnisse gespeichert werden können.
Eingabeparameter steht hier für die Liste der
Eingabeparameter der Funktion.
function [x, y] = beispielPlot3d(x_scale, y_scale, daemp) % Nur ein Beispiel % 3D-Plot als Function % usage: [x, y] = beispielPlot3d(x_scale, y_scale, daemp) % x % dies wird nicht mehr als Hilfe ausgegeben x = (-10:0.5:10); y = (-10:0.5:10)'; v = ones(length(x),1); X = v * x; Y = y * v'; f = cos( (x_scale*X).^2 + (y_scale*Y).^2 ) .* exp( -daemp * (X.^2 + Y.^2) ); axis([-10, 10, -10, 10]); mesh(x, y, f)Aufruf:
>> beispielPlot(.4, 0.6, 0.02)Verdeutlichung der Ausgabeparameterliste:
>>clear all >> [a, b] = beispielPlot3d( 0.4, 0.6 , 0.02);Welche Variablen befinden sich im Workspace und welchen Inhalt besitzen diese?
function[centroid, pointsInCluster, assignment]= myKmeans(data, nbCluster)
% usage
% function[centroid, pointsInCluster, assignment]=
% myKmeans(data, nbCluster)
%
% Output:
% centroid: matrix in each row are the Coordinates of a centroid
% pointsInCluster: row vector with the nbDatapoints belonging to
% the centroid
% assignment: row Vector with clusterAssignment of the dataRows
%
% Input:
% data in rows
% nbCluster : nb of centroids to determine
%
% (c) by Christian Herta ( www.christianherta.de )
%
data_dim = length(data(1,:));
nbData = length(data(:,1));
% init the centroids randomly
data_min = min(data);
data_max = max(data);
data_diff = data_max .- data_min ;
% every row is a centroid
centroid = ones(nbCluster, data_dim) .* rand(nbCluster, data_dim);
for i=1 : 1 : length(centroid(:,1))
centroid( i , : ) = centroid( i , : ) .* data_diff;
centroid( i , : ) = centroid( i , : ) + data_min;
end
% end init centroids
% no stopping at start
pos_diff = 1.;
% main loop until
while pos_diff > 0.0
% E-Step
assignment = [];
% assign each datapoint to the closest centroid
for d = 1 : length( data(:, 1) );
min_diff = ( data( d, :) .- centroid( 1,:) );
min_diff = min_diff * min_diff';
curAssignment = 1;
for c = 2 : nbCluster;
diff2c = ( data( d, :) .- centroid( c,:) );
diff2c = diff2c * diff2c';
if( min_diff >= diff2c)
curAssignment = c;
min_diff = diff2c;
end
end
% assign the d-th dataPoint
assignment = [ assignment; curAssignment];
end
% for the stoppingCriterion
oldPositions = centroid;
% M-Step
% recalculate the positions of the centroids
centroid = zeros(nbCluster, data_dim);
pointsInCluster = zeros(nbCluster, 1);
for d = 1: length(assignment);
centroid( assignment(d),:) += data(d,:);
pointsInCluster( assignment(d), 1 )++;
end
for c = 1: nbCluster;
if( pointsInCluster(c, 1) != 0)
centroid( c , : ) = centroid( c, : ) / pointsInCluster(c, 1);
else
% set cluster randomly to new position
centroid( c , : ) = (rand( 1, data_dim) .* data_diff) + data_min;
end
end
%stoppingCriterion
pos_diff = sum (sum( (centroid .- oldPositions).^2 ) );
end