Diagramme zeichnen
MATLAB und Octave zeichnen mit plot und Verwandten. In der Kommandozeile (ohne Fenster) speicherst du Bilder mit print/saveas:
x = linspace(0, 2*pi, 200);
y1 = sin(x);
y2 = cos(x);
figure;
plot(x, y1, 'b-', 'LineWidth', 2);
hold on;
plot(x, y2, 'r--');
hold off;
grid on;
xlabel('x'); ylabel('y');
title('Sinus und Kosinus');
legend('sin(x)', 'cos(x)', 'Location', 'northeast');
axis([0 2*pi -1.2 1.2]);
print -dpng diagramm.png| Funktion | Diagramm |
|---|---|
plot(x, y) | Linien (mit Format 'r--o': Farbe, Linienart, Marker) |
scatter(x, y) | Streudiagramm |
bar(werte), barh | Balken |
hist(daten, klassen) | Histogramm |
pie(werte) | Kreis |
semilogy, loglog | logarithmische Achsen |
subplot(2, 1, 1) | mehrere Diagramme in einem Fenster |
surf(X, Y, Z), mesh, contour | 3D-Flächen, Höhenlinien |
plot3(x, y, z) | Raumkurve |
imagesc(M) | Matrix als Bild |
[X, Y] = meshgrid(-2:0.1:2);
Z = X .* exp(-X.^2 - Y.^2);
surf(X, Y, Z);
colorbar;Wir können die Daten dahinter auch ohne Fenster prüfen:
x = linspace(0, 2*pi, 5);
y = sin(x);
disp([x' y'])
[X, Y] = meshgrid(1:3, 1:2)
Z = X .* YAusgabe
0 0 1.5708 1.0000 3.1416 0.0000 4.7124 -1.0000 6.2832 -0.0000 X = 1 2 3 1 2 3 Y = 1 1 1 2 2 2 Z = 1 2 3 2 4 6
Dateien lesen und schreiben
datei = tempname();
daten = [1 2 3; 4 5 6];
dlmwrite(datei, daten); % CSV schreiben
inhalt = fileread(datei)
gelesen = dlmread(datei)
csvwrite(datei, [7 8 9]);
csvread(datei)
fid = fopen(datei, 'w');
fprintf(fid, 'Zeile %d\n', 1:3);
fclose(fid);
fid = fopen(datei, 'r');
while true
zeile = fgetl(fid);
if ~ischar(zeile), break; end
disp(zeile)
end
fclose(fid);
save(datei, 'daten'); % Variablen speichern (.mat-artig)
clear daten
load(datei);
disp(size(daten))
delete(datei);
exist(datei, 'file')Ausgabe
inhalt = 1,2,3 4,5,6 gelesen = 1 2 3 4 5 6 ans = 7 8 9 Zeile 1 Zeile 2 Zeile 3 2 3 ans = 0
In MATLAB lesen readtable, readmatrix, writetable, writematrix, importdata Tabellen und CSV komfortabel; Excel via readtable('daten.xlsx').
Skripte, Funktionen und Struktur
Ein Projekt besteht meist aus:
projekt/
├── hauptskript.m % Ablauf
├── lade_daten.m % function daten = lade_daten(pfad)
├── berechne.m % function ergebnis = berechne(daten, parameter)
├── plot_ergebnis.m
└── daten/% hauptskript.m
clear; clc; close all;
parameter = struct('n', 100, 'rauschen', 0.1);
daten = lade_daten('daten/messung.csv');
ergebnis = berechne(daten, parameter);
plot_ergebnis(ergebnis);
fprintf('Fertig: %d Werte\n', numel(ergebnis));Tipps:
- Funktionen und Skripte mit Kommentar-Kopf dokumentieren (erscheint bei
help name) - Vorallokation:
x = zeros(1, n), bevor man in einer Schleife füllt tic/tocmessen Zeit, der Profiler (profile on) findet Engpässe- Eingaben prüfen mit
validateattributes,inputParser,assert - Versionsverwaltung (Git) auch für
.m-Dateien
tic; s = 0; for i = 1:1e5, s = s + i; end; zeit_schleife = toc;
tic; s2 = sum(1:1e5); zeit_vektor = toc;
fprintf('Ergebnis gleich: %d, Vektor-Version schneller: %d\n', s == s2, zeit_vektor < zeit_schleife);
n = 1e4;
a = zeros(1, n); % vorallokiert
for i = 1:n, a(i) = i^2; end
disp(a(end))Ausgabe
Ergebnis gleich: 1, Vektor-Version schneller: 1 1.0000e+08
Octave und MATLAB: Unterschiede
| Thema | MATLAB | Octave |
|---|---|---|
| Kommentar | % | % oder # |
| Strings | '...', "..." (String-Typ) | '...', "..." (beide Zeichenketten) |
| Skriptdateien mit Funktionen | Funktionen am Dateiende | Funktionen vor Nutzung, 1; am Anfang |
| Inkrement | x = x + 1 | zusätzlich x += 1, x++ |
| Blockende | end | end, endif, endfor ... |
| Toolboxen | kostenpflichtig | Pakete (pkg load statistics) |
| Tabellen | table, readtable | dataframe-Paket |
| Live Editor, Simulink | ja | nein |
Merke
plot,bar,hist,surf;hold on,subplot,xlabel,legend,printzum Speichern- Dateien:
fopen/fprintf/fgetl/fclose,dlmwrite/dlmread,save/load,fileread - Gute Praxis: Vorallokation, Vektorisierung, dokumentierte Funktionen,
tic/toc - Octave ist kostenlos und weitgehend kompatibel
Aufgabe
Zeichne die Funktion exp(-x/5) .* sin(2*x) von 0 bis 20 und speichere das Diagramm als PNG.