MLTutor - Hints: Unterschied zwischen den Versionen

Aus Physik
Zur Navigation springen Zur Suche springen
Zeile 122: Zeile 122:
 
o = [1 1 1 1;1 1 1 1;1 1 1 1]
 
o = [1 1 1 1;1 1 1 1;1 1 1 1]
 
wobei hier der Strichpunkt die Zeilen trennt.
 
wobei hier der Strichpunkt die Zeilen trennt.
  +
  +
= Programmeinheiten =
  +
  +
== Skript ==
  +
Ein Matlab-Skript läuft im Workspace ab und kann alle Variablen im Workspace verwenden und verändern. Somit verhält es sich nicht anders, als wenn man die Befehle Zeile für Zeile eingeben würde. Es stellt somit nur eine Vereinfachung gegenüber der händischen Eingabe dar, da man die Befehle abspeichern und somit immer wieder aufrufen kann.
  +
  +
== Funktion ==
  +
Im Unterschied zu einem Skript läuft eine Matlab [http://itp.tugraz.at/matlab/techdoc/ref/function.html Funktion] in einem abgeschlossenen Arbeitsbereich ab und kann daher nicht auf Variablen im Basis-Workspace zugreifen oder diese verändern.
  +
  +
Eine Funktion braucht eine Deklarationszeile am Anfang
  +
function out = name_func(in1,in2,in3,...)
  +
function [out1,out2,out3,...] = name_func(in1,in2,in3,...)
  +
mit dem Keyword [http://itp.tugraz.at/matlab/techdoc/ref/function.html function], den Namen der Outputvariablen, einem =, dem Namen der Funktion und den Namen der Inputvariablen.
  +
  +
So würde die Funktion
  +
function res = test(a,b)
  +
% Wurzel aus der Summe der Quadrate von a und b
  +
% Name des Autors
  +
% Datum
  +
res = sqrt(a.^2 + b.^2);
  +
die Wurzel aus der Summe der Quadrate von a und b berechnen. Der erste Block von Kommentarzeilen wird beim Aufruf von
  +
help test
  +
ausgegeben.
  +
  +
Die Werte von <tt>a</tt> und <tt>b</tt> werden erst beim Ausführen der Funktion übergeben
  +
r_1 = test(1,2); % a wird 1, b wird 2, r_1 wird sqrt(5)
  +
oder
  +
x = 2;
  +
y = 3;
  +
r_2 = test(x,y); % a wird 2 (x), b wird 3 (y), r_2 wird sqrt(13)
  +
  +
Die Namen der Variablen innerhalb der Funktion und ausserhalb können gleich sein, müssen es aber nicht. Auch bei gleichen Namen haben die Variablen nichts miteinander zu tun, da sie in verschiedenen Workspaces (Arbeitsbereichen) existieren. Der Austausch findet nur über die Übergabeparameter (Input und Output) statt.
   
 
= Links =
 
= Links =

Version vom 17. Februar 2006, 19:57 Uhr

Workspace

clear

Mit dem Befehl clear können lokale und globale Variablen im Matlab-Wokspace gelöscht werden. Bei allen Übungsabgaben soll das nicht gemacht werden. In MLTutor-Tests ist der Befehl clear lahm gelegt und mit der Variablen MLTutor_CLEAR_COUNT kann gezählt werden, wie oft clear verwendet wird.

Formatierung

Strichpunkt

Matlab Skripts und Funktionen sollten so geschrieben werden, dass sie keine Ausgabe am Schirm machen, die nicht explizit durch disp oder fprintf im Program veranlasst wird. Daher muss man am Ende von Anweisungen, die eine Ausgabe erzeugen einen Strichpunkt verwenden.

Korrekt:

x = 1:5; 
y = x.^2;
plot(x,y)

Ebenfalls korrekt sind Befehle in einer Zeile:

x = 1:5; y = x.^2; plot(x,y)

Ebenfalls korrekt, da jetzt auch Ausgabe vom Befehl plot:

x = 1:5; y = x.^2; ph=plot(x,y);

Syntax korrekt, erzeugt aber unerwünschte Ausgabe:

x = 1:5
y = x.^2
plot(x,y)

Syntax korrekt, erzeugt aber unerwünschte Ausgabe, da Beistrich satt Strichpunkt als Trennzeichen verwendet wird:

x = 1:5, y = x.^2, plot(x,y)

Syntax nicht korrekt, da Befehle in einer Zeile nicht einfach aneinander gereiht werden können:

x = 1:5 y = x.^2 plot(x,y)

In MLTutor Tests können fehlende Strichpunkte an Hand der Variablen MLTutor_DISPLAY_COUNT überprüft werden. Ist dieser Wert nicht Null fehlen Strichpunkte. Alle Übungsabgaben sollen so geschrieben sein, dass sie keine fehlenden Strichpunkte enthalten.

Kommentare

Kommentare kann man in Matlab schreiben, wenn man das Zeichen % verwendet. Das kann am Anfang der Zeile oder aber nach Befehlen gemacht werden:

% Initialisieren von Werten
x_start = 0; % Startwert
x_end = pi; % Endwert

Kommentare sollen sinnvoll zur Dokumentation von Programmen eingesetzt werden.

Hilfe

Der erste zusammenhängende Block von Kommentarzeilen in einem Skript oder einer Funktion wird bei Verwendung des Befehls help am Schirm ausgegeben. Dieser Text soll über den Aufruf bzw. die Aufgaben eines Matlab-Skrips oder einer Matlab-Funktion Auskunft geben:

function h = secansh(x,x_0,s)
% Funktion: secansh
% Aufruf: h = secansh(x,x_0,s)
% Berechnet fuer den Vektor x die Werte der normierten Secans Hyperbolicus 
% Funktion mit dem Maximum bei x_0 und mit der Halbwertsbreite s
% Input:  Vektor x, Skalar x_0, Skalar s
% Output: Vektor h(x)
%
% Name: Winfried Kernbichler
% Datum: 15.02.2006

% Beginn des eigentlichen Programms
h = ...

Unter der Annahme, dass dieses Programm im File secansh.m abgespeichert ist, liefert der Befehl help secansh die Zeilen

Funktion: secansh
Aufruf: h = secansh(x,x_0,s)
Berechnet fuer den Vektor x die Werte der normierten Secans Hyperbolicus 
Funktion mit dem Maximum bei x_0 und mit der Halbwertsbreite s
Input:  Vektor x, Skalar x_0, Skalar s
Output: Vektor h(x)

Name: Winfried Kernbichler
Datum: 15.02.2006

als Output am Schirm.

Solche Hilfetexte sollen bei allen Übungsbeispielen erstellt werden, manchesmal wird der Inhalt explizit überprüft. Dies wird aber in der Angabe zur Übung festgehalten.

disp

Formatierte Ausgabe am Schirm wird am einfachsten mit dem Befehl disp gemacht.

disp('Kernbichler')
name = 'Kernbichler'; disp(name)

gibt in beiden Fällen die Zeichenkette (string)

Kernbichler

aus.

Skalare, Vektoren, Matrizen können natürlich auch mit disp ausgegeben werden. So liefert

n = 5; disp(n) % Skalar
    5

z = 1:5; disp(z) % Zeilenvektor
    1     2     3     4     5

s = z.'; disp(s) % Spaltenvektor; z.' bedeutet transpose(z)
    1
    2
    3
    4
    5

o = ones(3,4); disp(o)
    1     1     1     1
    1     1     1     1
    1     1     1     1

Will man die Ausgabe von Zahlen mit der Ausgabe von Zeichen kombinieren, muss man die Zahlen in Zeichen verwandeln. Dazu gibt es unter anderem die Befehle num2str und mat2str. Damit kann man schreiben:

disp(['n = ',num2str(n)])
    n = 5

disp(['v = ',num2str(v)]) 
    v = 1  2  3  4  5

Die Klammern [] verbinden mehrere Zeichenketten zu einer

str1 = 'Mein'; str2 = 'Name';
str3 = [str1,str2]; disp(str3)
    MeinName

str3 = [str1,' ',str2]; disp(str3) % Mit Leerzeichen
    Mein Name

Die Befehle

disp(['s = ',num2str(s)])
disp(['o = ',num2str(o)])

würden Fehler der Art

??? Error using ==> horzcat
All matrices on a row in the bracketed expression must have the same number of rows.

liefern, da man nicht Variablen mit einer verschiedenen Anzahl von Zeilen nebeneinandet verbinden kann. Hier kann man sich mit mat2str behelfen

disp(['s = ',mat2str(s)])
    v = [1;2;3;4;5]

disp(['o = ',mat2str(o)])
    o = [1 1 1 1;1 1 1 1;1 1 1 1]

wobei hier der Strichpunkt die Zeilen trennt.

Programmeinheiten

Skript

Ein Matlab-Skript läuft im Workspace ab und kann alle Variablen im Workspace verwenden und verändern. Somit verhält es sich nicht anders, als wenn man die Befehle Zeile für Zeile eingeben würde. Es stellt somit nur eine Vereinfachung gegenüber der händischen Eingabe dar, da man die Befehle abspeichern und somit immer wieder aufrufen kann.

Funktion

Im Unterschied zu einem Skript läuft eine Matlab Funktion in einem abgeschlossenen Arbeitsbereich ab und kann daher nicht auf Variablen im Basis-Workspace zugreifen oder diese verändern.

Eine Funktion braucht eine Deklarationszeile am Anfang

function out = name_func(in1,in2,in3,...)
function [out1,out2,out3,...] = name_func(in1,in2,in3,...)

mit dem Keyword function, den Namen der Outputvariablen, einem =, dem Namen der Funktion und den Namen der Inputvariablen.

So würde die Funktion

function res = test(a,b)
% Wurzel aus der Summe der Quadrate von a und b
% Name des Autors
% Datum
res = sqrt(a.^2 + b.^2);

die Wurzel aus der Summe der Quadrate von a und b berechnen. Der erste Block von Kommentarzeilen wird beim Aufruf von

help test

ausgegeben.

Die Werte von a und b werden erst beim Ausführen der Funktion übergeben

r_1 = test(1,2);  % a wird 1, b wird 2, r_1 wird sqrt(5)

oder

x = 2;
y = 3;
r_2 = test(x,y);  % a wird 2 (x), b wird 3 (y), r_2 wird sqrt(13)

Die Namen der Variablen innerhalb der Funktion und ausserhalb können gleich sein, müssen es aber nicht. Auch bei gleichen Namen haben die Variablen nichts miteinander zu tun, da sie in verschiedenen Workspaces (Arbeitsbereichen) existieren. Der Austausch findet nur über die Übergabeparameter (Input und Output) statt.

Links

Folgende Linkarten sind vordefiniert:

mltutor://Projektname Interner Link zu MLTutor Projekt
matref://Funktionsname Link zu Matlab Hilfe wird zu http://itp.tugraz.at/matlab/techdoc/ref/sin.html
itpwiki://Wikieintrag Link zu ITP Wiki
appsoftkapitel://7 Link zu Applikationssoftwareskriptum Kapitel 7
appsoftskriptum Link zu Applikationssoftwareskriptum