MAL-Homepage
Inhaltsverzeichnis
MAL Dokumentation: Tutorial
1. HELLO WORLD
Die einfachste Methode ein Hello-World Programm in MAL zu schreiben ist die
Eingabe folgender Kommandozeile (beachten Sie, daß die Blanks als
Trennzeichen erforderlich sind):
: he "Hello World" . ;Wann immer Sie nun he eingeben, wird Hello World ausgegeben. Der Code hat folgende Bedeutung:
arbeitwird Entwicklungsumgebung für Testentwicklungen gestartet.
____________________________________________________________ Gibt "Hello World" auf der Konsole aus.Mit der Escape-Taste wird der Editor verlassen.
->
Dieses Wort ist fuer Demo-Zwecke. ____________________________________________________________
"Hello World" . breakpoint ;Der zusätzliche Befehl breakpoint hält den Interpreter an, damit der Text gelesen werden kann, bevor nach Ausführung des Programms die Entwicklungsumgebung neu geöffnet wird.
okwird der Interpreter fortgesetzt und geht automatisch wieder in die Entwicklungsumgebung. Mit der Escape-Taste wird die Arbeitsumgebung verlassen und durch Eingabe des Kommandos
byeder MAL-Interpreter beendet.
MAL-Homepage Inhaltsverzeichnis
2. DEBUGGING
Bauen Sie nun bewußt einen Fehler in den Code ein. Etwa folgendermaßen:
"Hello World" xxx . breakpoint ;Beim nächsten Ausführen von hello_world wird folgende Fehlermeldung und danach das Prompt debugging> erscheinen:
xxx << ? !Das Wort xxx kennt der Interpreter nicht. Wenn Sie nun ? eingeben, wird der Editor geöffnet und die Fehlerstelle markiert. Sie können den Fehler direkt beheben. Nach Verlassen des Editors kann der Interpreter durch Eingabe von ok fortgesetzt werden.
MAL-Homepage Inhaltsverzeichnis
3. ANALYSE VON 3D-DATEN
Als Testdatensatz für die nachfolgenden Beispiele können Sie
die Datei gangdat.met
downloaden und in Ihrer MAL-Directory speichern.
Sie enthält etwa zwei Schritte einer Ganzkörperaufnahme
beim Gehen.
Mit folgenden Befehlen können Sie die Daten in stereoskopischer
3d-Darstellung anzeigen:
public \ 3d \ interfaces >voc
"gangdat.met" meta> anima
Der Code hat folgende Bedeutung:
MAL-Homepage Inhaltsverzeichnis
3.1. Schrittbestimmung
Der erste Bewegungszyklus (erste Fussung links bis zur zweiten
Fussung links) kann folgendermaßen berechnet werden:
Einlesen der Daten und Speichern in der Variable figur.
public \ 3d \ interfaces >voc
"gangdat.met" meta> >> figur
Laden der Worte Fussungsbeginn,
Fussungsende usw. ins Vokabular:
public \ vetmed_analysen >voc
Bestimmung der Schrittgrenzen:
figur x \ Ferse_L Fussungsbeginn >> schrittgrenzen
Animation des ersten Schrittes:
figur schrittgrenzen split 1 , anima
MAL-Homepage Inhaltsverzeichnis
3.2. Zentrieren
Die von der Datei gangdat.met
eingelesenen Daten sind eine Instanz der Klasse
trajectories_class,
die eine Menge von
Member-Functions für die Bearbeitung von 3d-Objekten zur
Verfügung stellt.
Zum Beispiel kann mit der Funktion center das Zentrum aller
Trajektorien berechnet werden.
Einlesen der Daten und Berechnung des ersten Schrittes:
public \ 3d \ interfaces >voc
public \ vetmed_analysen >voc
"gangdat.met" meta> >> figur
figur x \ Ferse_L Fussungsbeginn >> schrittgrenzen
figur schrittgrenzen split 1 , >> schritt
Einzeichnen des Zentrums in die 3d-Darstellung:
schritt [ schritt center ] >trajectories && anima
Zentrieren der Figur:
schritt dup center - anima
MAL-Homepage Inhaltsverzeichnis
3.3. Vorspann und Nachspann wegschneiden
Die mit folgendem Code erzeugte Variable figur
public \ 3d \ interfaces >voc
"gangdat.met" meta> >> figur
enthält am Anfang und am Ende der Sequenz Bilder, in denen
nicht alle Trajektorien (Marker) sichtbar sind.
Die Bestimmung des Zeitbereichs mit lauter gültigen Marken
kann folgendermaßen erfolgen:
figur -999 999 trail >> bis >> von
Die Variable bis enthält dann die Bildnummer des letzten
gültigen Bildes und von die des ersten. Die Werte -999 und
999 bestimmen den Koordinaten-Wertebereich für sichtbare Marken.
(Unsichtbare Marken sind durch extreme Werte gekennzeichnet.)
Mit
figur von bis |--| >> ganze_figur
ganze_figur anima
können Vorspann- und Nachspannbereiche weggeschnitten werden.
MAL-Homepage Inhaltsverzeichnis
4. ANALYSE VON ANALOGDATEN
Für das folgende Beispiel müssen Sie die Datei
daten.met downloaden.
Sie enthält Daten von Bodenreaktionskräften beim Gehen von 10 Schritten.
Einen Plot der Daten erhalten Sie durch Eingabe folgender Kommandozeile:
"daten.met" meta> draw screen
Durch Drücken der Enter-Taste wird das Bild wieder geschlossen.
Das nachfolgende Beispiel soll das Zusammenspiel von mathematischen,
statistischen und graphischen Funktionen demonstrieren. Für die soeben
gelesenen Messdaten soll berechnet werden, ob zwischen der Höhe des
zweiten Höckers der Höhe des ersten Höckers ein lineare Zusammenhang
(lineare Regression) besteht.
Diese Aufgabe lässt sich durch folgende Schritte lösen:
Normalisieren
Im Zuge der Programmentwicklung werden auch für jeden
dieser Schritte Zwischenergebnisse dargestellt.
Starten sie zunächst die Entwicklungsumgebung indem sie auf der Konsole
arbeit eintippen und richten Sie eine neu
Funktion mit dem Namen kraftanalyse und folgendem Code ein:
: kraftdaten "daten.met" meta> ;
: bild draw screen ;
kraftdaten bild ;
Die Technik, in den Code von kraftanalyse lokale Definitionen
von MAL-Worten einzubauen, erhöht die Übersichtlichkeit des Codes und
kann beliebig geschachtelt angewandt werden. Wenn Sie unter
WIN98/NT arbeiten, werden lokale Definitionen beim nächsten
Öffnen des Editors automatisch komprimiert dargestellt. Mit Ctrl-E
kann der Code wieder expandiert werden.
Bedeutung des Codes:
Wenn Sie den Editor verlassen und den Menüpunkt go auswählen, so erscheint
folgendes Bild am Schirm:
Nun soll jede der 10 Kurven auf eine Länge von 100 Stützpunkten normalisiert werden.
Zu diesem Zweck wird ein Wort norm definiert und für jede Kurve
aufgerufen. Das Zwischenergebnis wird in der Variablen
kraft_norm zwischengespeichert und danach angezeigt.
: kraftdaten "daten.met" meta> ;
: bild draw screen ;
: norm 100 normalize ;
[ kraftdaten each norm ] >> kraft_norm
kraft_norm bild ;
Das Wort each ruft das danach
angeführte Wort norm
mit jeweils einer Kurve der kraftdaten auf. Mit den Worten
[ und ]
wird die Menge aller dadurch angelegten
Stackeinträge zu einem einzigen Verbund zusammengefasst. Das
Wort >> richtet eine neue Variable ein,
die in der Folge mit kraft_norm am Stack geholt und mit bild
angezeigt wird. Testen Sie den Code mit go -
es sollte folgendes Bild erscheinen:
Halbieren
Für das Teilen der Kurve werden die Worte teil1_berechnen
und teil2_berechnen definiert und getestet:
: teil1_berechnen 50 --| ;
: teil2_berechnen 50 |-- ;
Das Wort --| nimmt die
ersten 50 Samples der Zeitreihe und das Wort
|-- nimmt alles nach
den ersten 50 Samples.
Der komplette Code von kraftanalyse sieht dann folgendermaßen aus:
: kraftdaten "daten.met" meta> ; : bild draw screen ; : norm 100 normalize ; : teil1_berechnen 50 --| ; : teil2_berechnen 50 |-- ; [ kraftdaten each norm ] >> kraft_norm [ kraft_norm each teil1_berechnen ] >> teil1 [ kraft_norm each teil2_berechnen ] >> teil2 [ teil1 draw teil2 draw ] view screen ;Das hier neu eingeführte Wort view ermöglicht die Darstellung mehrerer Bilder in einem Schirmbild. Das Ergebnis sieht wie folgt aus:
Maxima berechnen
Im nächsten Schritt werden die Maxima der Teile berechnet und
zur Kontrolle ausgegeben. Zu diesem Zweck wird die letzte
Zeile von kraftanalyse durch folgenden Code ersetzt:
[ teil1 each max ] >> maxima1
[ teil2 each max ] >> maxima2
maxima1 . maxima2 . breakpoint ;
Beim Test des Codes werden die Maxima auf der Konsole ausgegeben.
Regression
Diese Ausgabe, also die letzte Zeile des Codes, wird nun im nächsten
Schritt durch eine lineare Regression ersetzt:
maxima1 maxima2 1 regress_plot screen ;
Der komplette Code sieht nun wie folgt aus:
: kraftdaten "daten.met" meta> ;
: bild draw screen ;
: norm 100 normalize ;
: teil1_berechnen 50 --| ;
: teil2_berechnen 50 |-- ;
[ kraftdaten each norm ] >> kraft_norm
[ kraft_norm each teil1_berechnen ] >> teil1
[ kraft_norm each teil2_berechnen ] >> teil2
[ teil1 each max ] >> maxima1
[ teil2 each max ] >> maxima2
maxima1 maxima2 1 regress_plot screen ;
Wollen Sie den Code noch weiter optimieren, so kann das Speichern
der Zwischenergebnisse in Variable eingespart und das
Normalisieren sowie die Berechnung der Maxima direkt in
teil1_berechnen bzw teil2_berechnen eingebaut werden.
: kraftdaten "daten.met" meta> ;
: teil1_berechnen 100 normalize 50 --| max ;
: teil2_berechnen 100 normalize 50 |-- max ;
[ kraftdaten each teil1_berechnen ]
[ kraftdaten each teil2_berechnen ] 1 regress_plot screen ;
Das Ergebnis zeigt keine lineare Abhängigkeit zwischen
erstem und zweitem Maximum der Kraftkurven:
MAL-Homepage Inhaltsverzeichnis
5. ARCHIVIERUNG
In der Praxis empfiehlt sich für die Archivierung von Messdaten die
Nutzung des objektorientierten Messdaten-Archivs
(siehe Messdaten-Archiv).
Das hier angeführte Beispiel gibt aber einen Einblick in die
zugrunde liegenden Methoden der Datenarchivierung.
Im Folgenden wird eine Datenbank (ein Folder)
für die Messdatenarchivierung eingerichtet. Statt echter Messdaten werden
Reihen von Zufallszahlen verwendet, die jeweils unter einem frei wählbaren Namen archiviert werden.
Starten Sie zunächst wieder die Entwicklungsumgebung durch Eingabe des Kommandos
arbeit .
Die Aufgabe lässt sich in folgende Schritte aufgliedern:
MAL-Homepage Inhaltsverzeichnis
5.1. Einrichten einer Datenbank
Starten Sie die Entwicklungsumgebung mit arbeit und erzeugen Sie
mit dem Menüpunkt insert ein neues Wort mit dem Namen
my_folder. Wählen Sie als Datentyp Variable
und tragen Sie unter Init-Value folgenden Code ein:
"work" wopen_pool "work" FO_createAuf diese Weise wird eine Datenbank-Tabelle eingerichtet und der Handle in der Variablen my_folder gespeichert.
MAL-Homepage Inhaltsverzeichnis
5.2. Festlegen der Datenbank-Struktur
Ezeugen Sie ein neues Wort vom Typ Function für die Administration von my_folder
mit dem Namen admin_my_folder mit folgendem Code:
my_folder >voc FO_admin ;Wenn Sie dieses Wort mit go starten erscheint ein Menü. Wählen Sie aus diesem den Menüpunkt attributes und fügen Sie in die daraufhin erscheinende Tabelle jeweils mit insert zwei Attribute mit folgenden Werten ein: Damit ist festgelegt, daß jeder Eintrag von my_folder zwei Attribute (nämlich einen Text mit dem Namen der Messdaten und den Messdatensatz selbst) besitzt.
MAL-Homepage Inhaltsverzeichnis
5.3. Speichern und Lesen der Daten
Für das Bearbeiten der Daten in my_folder wird eine Funktion
browse_my_folder eingerichtet und vorerst mit folgendem Code versehen:
: messdaten 5 random "messdaten" >name ; messdaten draw screen ;Das Wort messdaten erzeugt einen Dummy-Messdatensatz mit 5 Zufallszahlen und gibt ihm den Namen "messdaten". Die zweite Codezeile dient zum Testen. Jedesmal wenn Sie nun browse_my_folder mit go starten, erhalten Sie ein Bild neuer Dummy-Messdaten.
"work" wopen_pool my_folder >voc [ "Insert" "einfügen" ] FO_browse ;Die erste dieser beiden Zeilen öffnet die Datenbank my_folder, die zweite startet den Browser mit einem Menüpunkt mit dem Namen 'Insert'. Wenn Sie nun browse_my_folder starten sollte ein leere Tabelle mit der Kopfzeile
Name________erscheinen. Allerdings führt der Aufruf des Menüpunktes Insert noch zu einer Fehlermeldung, da das dazugehörige Wort einfügen noch nicht existiert.
: einfügen drop FO_maske writemask messdaten append FO_write drop FO_daten ;Bedeutung des Codes:
: zeichnen >> eintrag eintrag \ messdaten draw screen ;und in die Menüliste eingetragen:
[ "Plot" "zeichnen" "Insert" "einfügen" ] FO_browse ;Bedeutung des Codes von zeichnen:
[ "Plot" "zeichnen" "Insert" "einfügen" "Delete" "standard_loeschen" "Find" "standard_suchen" "Modify" "standard_aendern" "Read" "standard_lesen" ] FO_browse ;
MAL-Homepage Inhaltsverzeichnis