MAL-Homepage Inhaltsverzeichnis



MAL Dokumentation: Tutorial




Inhalt:

1. HELLO WORLD
2. DEBUGGING
3. ANALYSE VON 3D-DATEN
3.1. Schrittbestimmung
3.2. Zentrieren
3.3. Vorspann und Nachspann wegschneiden
4. ANALYSE VON ANALOGDATEN
5. ARCHIVIERUNG
5.1. Einrichten einer Datenbank
5.2. Festlegen der Datenbank-Struktur
5.3. Speichern und Lesen der Daten


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: Nachteil dieser Definition ist, daß he beim Verlassen des MAL-Interpreters verloren geht. Für dauerhaftere Entwicklungen empfiehlt sich die Nutzung der Entwicklungsumgebung. Durch Eingabe des Kommados
arbeit
wird Entwicklungsumgebung für Testentwicklungen gestartet.

Um ein neues MAL-Wort (=Prozedur oder Programm) anzulegen, wählen Sie den Menüpunkt insert und wählen als Datentyp Function aus.

Zunächst erscheint ein Editor-Fenster zum Eingeben des Helptextes. Die erste Zeile ist zwingend auszufüllen. Um korrekt zu sein sollte auch ein Syntaxdiagramm angeführt werden. Für hello_world sieht eine korrekte Help-Page etwa so aus:
____________________________________________________________
Gibt "Hello World" auf der Konsole aus. 




->



Dieses Wort ist fuer Demo-Zwecke. ____________________________________________________________
Mit der Escape-Taste wird der Editor verlassen.

In der daraufhin erscheinenden Eingabemaske brauchen Sie nur die Felder name und topic ausfüllen, den Rest können Sie unverändert überspringen.

Danach erscheint ein neuer Eintrag hello_world im Fenster der Entwicklungsumgebung. Markieren Sie diesen mit der Maus bzw. den Cursor-Steuertasten und wählen Sie den Menüpunkt code. Im daraufhin erscheinenden Editor editieren Sie folgenden Code:
"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.

Jedesmal wenn Sie nun den Menüpunkt go auswählen, wird auf der Konsole der Text Hello World erscheinen. Darunter erscheint das Prompt breakpoint> was anzeigt, daß der Interpreter an einem Haltepunkt steht. Durch Eingabe von
ok
wird der Interpreter fortgesetzt und geht automatisch wieder in die Entwicklungsumgebung. Mit der Escape-Taste wird die Arbeitsumgebung verlassen und durch Eingabe des Kommandos
bye
der 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:



Nach Ausführung dieser Befehle erscheint ein kleines Menü zum Eingeben des Massstabs. Durch Drücken der Enter-Taste kann die Voreinstellung (0.1) verwendet werden, was bedeutet, dass die Darstellung der Figur einem Zehntel der Originalgröße entspricht.

Es erscheint zunächst ein dreidimensionales Achsenkreuz, das mit der Maus bei gedrückter linker Taste gedreht werden kann. Durch Drücken der R-Taste kann die Animation gestartet und gestoppt werden. Das Mausrad kann für die Einstellung der Wiedergabegeschwindigkeit verwendet werden. Mit der Escape-Taste wird die Animation beendet.

Um das Bild räumlich sehen zu können benötigt man eine Rot/Grün-Brille (linkes Glas rot, rechtes Glas grün).



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:

  1. Einrichten einer Datenbank.
  2. Festlegen der Datenbank-Struktur.
  3. Speichern und Lesen der Daten.

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_create
Auf 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.

Verlassen Sie die Attribut-Tabelle mit der Escape-Taste und rufen Sie den Menüpunkt init-mask auf. Damit wird die Ein/Ausgabemaske für die Datensätze initialisiert. Mit edit-mask können Sie die Struktur der Maske kontrollieren und nachkorrigieren. Verlassen Sie danach das Adiministrations-Menü.

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.

Ersetzen Sie nun die zweite Codezeile durch folgende zwei:
"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.

Verlassen Sie den Browser mit der Escape-Taste und fügen Sie in den Code von browse_my_folder noch die Definition von einfügen ein:
: einfügen drop
FO_maske writemask 
messdaten append
FO_write 
drop FO_daten ;
Bedeutung des Codes: Wenn Sie nun browse_my_folder starten, sollte der Menüpunkt Insert funktionieren. Um Plots von den gespeicherten Datensätzen anzeigen zu können wird noch das Wort zeichnen definiert
: zeichnen >> eintrag
eintrag \ messdaten draw screen ;
und in die Menüliste eingetragen:
[ "Plot" "zeichnen" "Insert" "einfügen" ] FO_browse ;
Bedeutung des Codes von zeichnen: Es existieren noch einige vordefinierte Menüpunkte, die einfach in der Menüliste angeführt werden können. So kann die letzte Zeile von browse_my_folder durch folgenden Code ersetzt werden, um eine komfortable Datenbank zu erhalten:
[ 
"Plot" "zeichnen"
"Insert" "einfügen"
"Delete" "standard_loeschen"
"Find" "standard_suchen"
"Modify" "standard_aendern"
"Read" "standard_lesen"
] FO_browse ;

MAL-Homepage Inhaltsverzeichnis