EMZETT.
Login

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

Kapitel 3 von 8 im Kurs MATLAB. Mit Fortschritt, Quiz und Zertifikat auf der Lernseite.

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  1

Schleifen

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 7

Vektorisierung 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.5000

Funktionen

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!
10

Anonyme 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
3

Fehler 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
weiter

Merke

  • 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

Weiter im Kurs

Zurück: Vektoren und Matrizen

Weiter: Text, Cell Arrays und Strukturen

Alle Kapitel: MATLAB im Überblick