Kurz: if x > 5 && mod(x, 2) == 1 % && und || für einzelne Werte disp(‘größer als 5 und ungerade’) end
Teil des Kurses MATLAB
Bedingungen
x = 7;
if x > 10
disp('groß')
elseif x > 5
disp('mittel')
else
disp('klein')
end
if x > 5 && mod(x, 2) == 1 % && und || für einzelne Werte
disp('größer als 5 und ungerade')
end
wert = 'b';
switch wert
case 'a'
disp('A')
case {'b', 'c'}
disp('B oder C')
otherwise
disp('anderes')
end
a = [1 0 1];
b = [1 1 0];
a & b % elementweise
a | b
~a
xor(a, b)Ausgabe:
mittel
größer als 5 und ungerade
B oder C
ans =
1 0 0
ans =
1 1 1
ans =
0 1 0
ans =
0 1 1Schleifen
for i = 1:3
fprintf('i = %d\n', i);
end
for v = [10 20 30]
fprintf('%d ', v);
end
fprintf('\n');
for k = 10:-4:1
fprintf('%d ', k);
end
fprintf('\n');
n = 3;
while n > 0
fprintf('%d ', n);
n = n - 1;
end
fprintf('\n');
for i = 1:10
if mod(i, 2) == 0, continue; end
if i > 7, break; end
fprintf('%d ', i);
end
fprintf('\n');Ausgabe:
i = 1
i = 2
i = 3
10 20 30
10 6 2
3 2 1
1 3 5 7Vektorisierung ist in MATLAB schneller und kürzer als Schleifen:
x = 1:10;
quadrate_schleife = zeros(1, 10);
for i = 1:10
quadrate_schleife(i) = i^2;
end
quadrate_vek = x .^ 2;
isequal(quadrate_schleife, quadrate_vek)
sum(x(mod(x, 2) == 0)) % Summe der geraden Zahlen ohne Schleife
cumprod(1:6)
arrayfun(@(v) v * 2, [1 2 3])
mean(x(x > 3 & x < 8))Ausgabe:
ans = 1
ans = 30
ans =
1 2 6 24 120 720
ans =
2 4 6
ans = 5.5000Funktionen
In MATLAB steht jede Funktion normalerweise in einer eigenen Datei (name.m). In Skripten (und in Octave) kannst du Funktionen auch direkt definieren, bevor du sie benutzt. Die erste Zeile 1; verhindert in Octave, dass die Datei als Funktionsdatei gilt.
1;
function r = quadrat(x)
r = x .^ 2;
end
function [kleinstes, groesstes, mittel] = kennzahlen(v)
kleinstes = min(v);
groesstes = max(v);
mittel = mean(v);
end
function gruss(name, anrede)
if nargin < 2
anrede = 'Hallo';
end
fprintf('%s, %s!\n', anrede, name);
end
function s = summe_alle(varargin)
s = 0;
for i = 1:numel(varargin)
s = s + varargin{i};
end
end
disp(quadrat(7))
disp(quadrat([1 2 3]))
[lo, hi, m] = kennzahlen([4 8 15 16 23 42]);
fprintf('%d %d %.2f\n', lo, hi, m);
[~, hi2] = kennzahlen([1 2 3]); % ~ ignoriert einen Rückgabewert
disp(hi2)
gruss('Mia')
gruss('Tom', 'Hi')
disp(summe_alle(1, 2, 3, 4))Ausgabe:
49
1 4 9
4 42 18.00
3
Hallo, Mia!
Hi, Tom!
10Anonyme Funktionen und Funktions-Handles
f = @(x) x.^2 + 2*x + 1;
g = @(x, y) sqrt(x.^2 + y.^2);
disp(f(3))
disp(g(3, 4))
disp(f([0 1 2]))
h = @sin; % Handle auf eine vorhandene Funktion
disp(h(pi/2))
faktor = 10;
skaliere = @(x) x * faktor; % fängt faktor ein
faktor = 99;
disp(skaliere(2))
wende_an = @(fun, v) fun(v);
disp(wende_an(@sum, [1 2 3]))
disp(cellfun(@numel, {'a', 'bb', 'ccc'}))
disp(arrayfun(@(k) k^2, 1:5))
disp(func2str(f))
disp(fzero(@(x) x.^2 - 2, [0 2])) % Nullstelle: sqrt(2)
disp(integral(@(x) x.^2, 0, 3)) % Integral von x^2 von 0 bis 3 = 9
disp(fminsearch(@(x) (x - 3).^2 + 1, 0))Ausgabe:
16
5
1 4 9
1
20
6
1 2 3
1 4 9 16 25
@(x) x .^ 2 + 2 * x + 1
1.4142
9
3Fehler und Prüfungen
1;
function r = sicher_teilen(a, b)
if b == 0
error('Mathe:division', 'Division durch null bei a = %d', a);
end
r = a / b;
end
try
disp(sicher_teilen(10, 2));
disp(sicher_teilen(1, 0));
catch err
fprintf('Fehler (%s): %s\n', err.identifier, err.message);
end
assert(1 + 1 == 2, 'Mathe stimmt');
isempty([])
isempty(5)
exist('pi')
validateattributes(5, {'numeric'}, {'positive'});
warning('off', 'all');
disp('weiter')Ausgabe:
5
Fehler (Mathe:division): Division durch null bei a = 1
ans = 1
ans = 0
ans = 5
weiterMerke
if/elseif/else,switch,for,while,break,continue- Vektorisierung (
x .^ 2,sum(x(x > 0))) statt Schleifen - Funktionen:
function [a, b] = name(x),nargin,varargin,~ignoriert Ausgaben - Anonyme Funktionen
@(x) ..., Handles@sin,arrayfun,cellfun try/catch,error,assert- Octave: Skripte beginnen mit
1;, wenn sie Funktionen definieren
Übungsaufgabe
Schreibe eine Funktion [mittel, abw] = statistik(v) für Mittelwert und Standardabweichung.
Quiz zur Selbstkontrolle
Wofür steht @(x) x.^2?
- Eine anonyme Funktion (richtig)
- Eine Matrix
- Ein Kommentar
- Ein Operator
Wie ignoriert man einen Rückgabewert?
- [~, b] = f(x) (richtig)
- [_, b] = f(x)
- [null, b] = f(x)
- = f(x)
Warum ist Vektorisierung vorteilhaft?
- Kürzerer und meist schnellerer Code (richtig)
- Sie ist Pflicht
- Sie spart Speicher immer
- Sie ist nur für Matrizen
Weiter im Kurs
Zurück: Vektoren und Matrizen
Weiter: Text, Cell Arrays und Strukturen
Alle Kapitel: MATLAB im Überblick