MatMate
Matrizen-Taschenrechner
unter Windows 98
Version:
Testversion 0.0510
Okt 2005
Gottfried Helms
Universität Kassel
email:
helms@uni-kassel.de
MatMate Einführung
MatMate ist für Matrizenrechnen das, was für normales Rechnen ein einfacher "Taschenrechner" ist: ein einfach zu bedienendes Werkzeug auch für nebenbei zu bewältigende Zwischenrechnungen.
Auf eine Simulation der
Knöpfcheneingabe wie bei Taschenrechnern üblich wurde dennoch verzichtet;
stattdessen hat man ein Eingabefeld für eine Zahl oder Formel - genauergenommen
sogar eine ganze Textdatei.
Der Befehl
x = 7
erzeugt ein Anzeigefeld namens X und
zeigt dort die Zahl 7 an. Der Befehl
y = 4*(3+x)^2
erzeugt ein Anzeigefeld namens Y und
zeigt dort das Ergebnis der Formel an, unter Einrechnung des X, das soeben
vorher berechnet wurde.
Der Befehl
A={1,2,4}
erzeugt eine Matrix namens A und zeigt
sie an. Der Befehl
B = A * A'
berechnet das Matrixprodukt aus A und
der Transponierten A (A') und zeigt dieses mit dem Namen B an.
Alle Anzeigen bleiben in der Liste der
einfachen Variablen (skalare Ergebnisse wie x und y) oder als separate Matrix
(wie A und B) im MatMate-Anzeige-"Regal" stehen solange sie nicht
explizit gelöscht werden:
delete x,y,b
Sie tippen die Befehle so wie sie hier
stehen, wie in einer Textverarbeitung. Dabei haben Sie alle Möglichkeiten der
Tippfehlerkorrektur, Übernahme von Zeilen aus Ihrer Textverarbeitung via
Clipboard etc.
Um den Befehl auszuführen lassen Sie
die Cursormarke auf der Zeile und drücken das Knöpfchen Run! . Es gilt: eine Zeile -
eine Formel/ein Befehl.
Mehrere Zeilen können zusammen
ausgeführt werden.
Also
A = {1,2,4}
B = A * A'
Markieren Sie beide Zeilen schwarz,
dann können sie mit Einem Run!-Befehl ausgeführt werden.
Statt des Knopfes Run!
können Sie einfach die Tastenkombination ALT-R
drücken - dann brauchen Sie nicht ständig zwischen Maus und Tastatur zu
wechseln.
MatMate ist noch nicht vollständig
ausprogrammiert; insbesondere bekommen Sie noch keine Fehleranalyse für
Tippfehler: was nicht geht, wird meist einfach übergangen.
Da es aber bereits jetzt nützlich für einfache Rechnungen wie auch für das
Studium von Matrizenrechnungen ist, möchte ich es jetzt als Beta-/Testversion
veröffentlichen.
· Rechnen
Es sind alle Standardrechenarten und
einige spezielle Funktionen (meist für Matrizen und die Untersuchung der
Korrelationsanalyse) implementiert. Darunter sind die 4 Grundrechenarten,
Potenzierung, Exponential und trigonometrische Funktionen, sowie viele Matrizenfunktionen,
bei denen sich auch ein großer Teil mit dem Extrahieren von Teilmatrizen und
Zusammensetzen von Matrizen beschäftigt.
Intern wird mit Standardgenauigkeiten
gerechnet (integer 32 bit, reell extended), es ist also noch keine
multiprecision-Arithmetik eingebaut.
Die Formelsprache / die Syntax
· 1 Befehl pro Zeile
Grundprinzip ist: eine Zeile - ein
Berechnungs-Befehl: Cursor setzen - Formel eintippen - Run! - (MatMate rechnet) - Ergebnis wird in eigenem Fenster
angezeigt.
Am Ende jeder Zeile kann zusätzlich
ein beliebiger Kommentar stehen, z.B. weil Sie lange Befehlsfolgen abspeichern
und beschreiben wollten. Trennen Sie einen Kommentar durch einen
Doppelschrägstrich //, also zwei aufeinanderfolgende / von der Formel ab.
Eine Berechnung ohne Kommentar...
a = {1,2,3,4}
...mit Kommentar
a = {1,2,3,4} // eine 1-zeilige Matrix mit 4 Einträgen anlegen
Eine Zeile kann auch fortgesetzt
werden; am Ende muß dann ein einzelnes Unterstreichungszeichen stehen (wie in
Visual Basic)
a = { {1,2}, _
{3,4} _
}
// eine 2x2 Matrix anlegen
Der Cursor muß in eine der
auszuführenden Zeilem gesetzt werden.
Die Zeilengruppe braucht nicht als
ganzes markiert zu werden, wenn das Fortsetzungszeichen enthalten ist.
· mehrere Befehle
Es können auch mehrere Befehle
zusammen ausgeführt werden. Mann muß dann die Markierung auf die gewünschten
Zeilen erweitern.
a = {1,2,3,4}
//
b = a * a '
Die Markierung überstreicht beide
Zeilen; der Cursor kann irgendwo stehen. Run! drücken. Beide Zeilen werden zusammen ausgeführt.
Ist eine Markierung vorhanden, werden
alle Zeilen, die von ihr berührt werden inclusive evtl vorhandener vorlaufender
und nachlaufender Fortsetzungszeilen ausgeführt. Ein komplexes Beispiel:
a = mk (2,2, _
1,2, _
3,4) // eine 2x2 Matrix anlegen,
alternative Formel
b = mk (2,2, _
1,3, _
2,4) // die Transponierte anlegen
c = a * b - _
b * a //
Matrixmultiplikationen
Alle 3 Befehle, die hier von der
Markierung berührt werden, werden komplett gelesen und ausgeführt. Der Cursor
braucht in diesem Fall NICHT in einem der Befehle zu stehen. Die Markierung
wird nach Ausführung nicht entfernt; Befehle können deshalb iteriert werden,
indem man einfach Run!
oder die Alt-R-Taste
mehrmals drückt.
Ist KEINE Markierung vorhanden, wird
die Zeile ausgeführt, in der sich der blinkende Cursor befindet.
· einfaches Ändern der Daten einer Matrix
Neben der einfachen Berechnungsweise
für Matrizen ist auch die direkte Werteingabe ein praktisches Feature, mit
denen Veränderungen im Input einer Formel schnell ausprobiert werden können.
Diese Methode ist aber nicht
empfohlen, da Veränderungen, die nicht als Text-Befehl auftauchen, auch nicht
im Journal protokolliert werden, und Sie Ihre Arbeit später nicht mehr
automatisch wiederholen können. Stattdessen können Sie, wenn Sie z.B. in Zeile
2, spalte 3 der Matrix A eine bestimmte Zahl eintragen wollen, den üblichen
Matrixbefehl verwenden
A[2,3] = 7.2345
· Arbeiten mit Daten aus der Literatur
Dadurch, daß die Bedienung des
Matrizenrechners über eine Skriptsprache funktioniert, können Sie Matrizen, die
Sie aus der Literatur übernommen haben, als Text-/Skript-Eingabe speichern, und
Ihre Untersuchungen später mit demselben Datenmaterial reproduzieren oder
abwandeln.
Journal
Alle ausgeführten Befehle werden in
einem Journal protokolliert. Diese Datei wird anschließend automatisch
gespeichert. Durch die Journal-Funktion können Sie alle Berechnungsschritte
reproduzieren, eventuelle Denkfehler untersuchen und verbessern. Insbesondere
bei Iterationen ist das Journal vorteilhaft: alle Iterationsschritte sind
sequentiell hintereinander aufgezeichnet und können später en bloc wiederholt
werden.
Interaktion mit anderen Programmen unter Windows
Es gibt 3 Schnittstellen: Da Sie
Befehle/Formeln tippen, haben Sie die Möglichkeit Ihre Arbeiten und
Analyseschritte in normalen Textdateien zu spreichern. Die berechneten Matrizen
können Sie außerdem in Dateien an andere statistische oder mathematische Programme
übergeben oder sie in denselben Formaten von dort aus einlesen. Die dritte Möglichkeit
ist die Windows-Zwischenablage, über die Sie Matrizendaten z.B. direkt an Excel
oder Winword übergeben können.
(Aktuelles)
·
COMP c = <formel>
In der aktuellsten Version kann der
Befehlsteil COMP überall entfallen. Die Grafiken in diesem Heft zeigen noch den
Stand der vorigen Version. Die dort dargestellte Syntax funktioniert aber immer
noch.
Formel ausrechen:
Neu:
A = {1,2,3} * {1,2,3} '
Alt:
COMP A = {1,2,3} * {1,2,3} '
Ziele / Begrenzungen
Tool zur Matrizenrechnung
Das Hauptziel dieses Programms ist die
Unterstützung des Selbststudiums der Hintergründe und Vorgänge bei der
Matrizenrechnung. Man kann viele Rechenprozesse aus der Literatur
nachvollziehen und transparent machen.
Es ist bisher NICHT intendiert, eine
vollständige Programmiersprache zu entwickeln. Es ist ebenfalls bisher nicht
intendiert, ein symbolisches Algebrasystem zu implementieren. Hierzu gibt es
bereits diverse professionelle und semiprofessionelle Angebote, und sogar Freeware-Versionen.
MatMate will dazu nicht in Konkurrenz gehen.
Eventuell wird es in einer nächsten
Version eine Makro-Sprache geben, sofern sie ohne Änderung des momentan
vorhandenen Einfachst-Konzeptes integriert werden kann.
Anzeigen der Ergebnisse/Ausgabeprotokoll
Der Schwerpunkt liegt -neben der
Verfügbarkeit eines billigen Matrizenrechners auf Leistungskurs- und
College-Niveau - auf der Sichtbarmachung der Rechenvorgänge. Durch die Präsenz
der Matrizenanzeige wird die Matrixalgebra besonders transparent. Die Matrixergebnisse
kann man via Clipboard in konventionelle Textverarbeitungsprogramme übernehmen.
Eventuell wird es in Zukunft ein
laufendes Ausgaben-Fenster geben, in das Ergebnisse zusammen mit den
Formeln/befehlen dokumentiert werden, sodaß matrizenanalytische/statistische
Artikel unter Einbeziehung der Operationen und Ergebnisse direkter geschrieben
werden können
Betaversion
Es handelt sich hier noch um eine
Beta-Version, für die noch Listen an zu verbessernden Optionen bestehen.
Insbesondere gibt es noch keine
besondere Fehleranalyse; Fehler in der Syntax oder während einer Berechnung
führen meist einfach zum Überspringen des betreffenden Befehls, und evtl der
Folgebefehle. Programmabstürze sind immerhin in der aktuellen Testphase noch
nicht aufgetreten - d.h. Arbeitsergebnisse und Skripte sind noch nicht verloren
gegangen.
Auch sind einige mathematische
Verfahren noch nicht vollständig stabilisiert; hier sind meist einfach die von
Borland-Delphi gelieferten Methoden übernommen. Meist wird hierbei mit
Extended-Präzision gearbeitet, es gibt einige Double-Precision-Module. D.h.
Genauigkeit bei numerischen Operationen Zahlen liegt bei ca 15 Dezimalstellen.
Die Größe von Arrays/Matrizen wird von
32-bit Integer-Variablen verwaltet; dh. sie dürften praktisch nur durch den bei
Ihnen vorhandenen Hauptspeicher begrenzt sein.
·
Keine Garantie für
Datenverluste unmittelbar oder mittelbar.
einfache Beispiele
skalarer Rechner
Die Grundrechenarten sowie
logarithmische und trigonometrische Funktionen sind implementiert. In den
Formeln können Klammern beliebig tief verschachtelt werden. Man kann auf
bereits berechnete Ergebnisse zurückgreifen, da jedes Ergebnis einer (skalaren)
Variablen (also einem benanntem Anzeigefeld) zugewiesen wird, auf das Sie sich
in einer nächsten Formel beziehen können. "Skalar" ist hier die
Bezeichnung für einen einzelnen Wert, in Abgrenzung (dieser gewöhnlichen)
Rechnung mit einzelnen Zahlen von der Rechnung mit Vektoren, Matrizen
und Arrays.
Anzeigen skalarer Ergebnisse
Wenn Sie einen einzelnen Wert so wie
auf dem Taschenrechner berechnen wollen, tippen Sie einfach die Formel
(Verwenden Sie den Punkt als Dezimal-Trennzeichen):
EinkaufSumme = 1.12 + 4.50 + 3.38 + 2.50 + 7.68
Im Anzeigefeld "skalare
Variable" wird die Einkaufssumme angezeigt.
oder
// TE_Woche1 : Telefoneinheiten in der Woche Nr...
TE_Woche1= 12+23+45+16+23+8+2
TE_Woche2= 14+13+ 5+ 2+11 + _
+23 + 78 +126
TE_Woche3 = 11+23+45+1+1+3+2+6+8+8+9+11+12
TE_Woche4 = 1+5+12+45+67+2+42+64+26
// TE_Jan: Telefoneinheiten für Monat Januar
TE_Jan = TE_Woche1 + TE_Woche2+ _
TE_Woche3+TE_woche4
Im Anzeigefeld "skalare
Werte" werden die Wochensummen und die Summe für Januar angezeigt.
komplexere Formeln
Formeln können Klammern enthalten und
beliebig komplex werden. Neben den arithmetischen Rechenarten können auch
logische Vergleiche und eine einfache Form des bedingten Rechnens verwendet
werden.
x= (a^3 + 3*a*5*(a + 5) +
5^3)^(1/3)
phi2 = 1- cos(phi)^2
root = sqrt(a-b) if (a>=b) else
sqrt(b-a)
umf = 2*radius*#pi^2
Sie können in den Formeln #pi und #e,
sowie #false und #true als Konstanten angeben.
Beispiel mit Iterationen
Z.B. wollen Sie nachvollziehen, wie
mit dem Newton-Verfahren die Wurzel aus 14 berechnet wird. Das übliche Ergebnis
berechnen Sie einfach mit der gewöhnlichen Taschenrechnerfunktion.
Y = sqrt(14)
Es wird eine Anzeigezeile für das
Ergebnis erzeugt, und dies erhält den Namen Y. Sie können beliebige Namen
bis zur Länge von 16 Buchstaben wählen:
standard_Y = sqrt(14)
Nun programmieren Sie das
Newton-Verfahren. Man nimmt einen Probewert, setzt ihn in die Newton'sche Formel
ein, berechnet einen neuen Wert, der wegen der Konstruktion der Formel besser
ist als der erste und nimmt diesen dann als neuen Probewert. Das macht man
solange, bis der Wert sich nicht mehr (nennenswert) ändert.
wert=1 // einen Anfangswert einstellen
Führen Sie den obenstehenden Befehl
aus. wert wird angezeigt. Tippen Sie dann die beiden folgenden
Befehle und führen Sie sie zusammen aus (Markierung auf beide Zeilen erweitern
und Alt-R drücken):
altwert = wert
wert = (14 / altwert + altwert) / 2
Die Anzeigezeile für altwert
wird eingestellt, und für wert wird gleich die neue Version
ausgerechnet. Wiederholen (iterieren) Sie jetzt diese Befehlsfolge, bis sich wert
nicht mehr wesentlich ändert. Er sollte dann mit standard_y
übereinstimmen. Die verbliebene Ungenauigkeit können Sie sich anzeigen lassen,
indem Sie wert von standard_y abziehen:
chk = wert - standard_y
Durch die Anzahl der Iterationen
können Sie die Wurzel aus 14 beliebig genau bestimmen. Die Grenzen der
maximalen Genauigkeit sind hier die des Betriebssystems, dessen
DOUBLE-Genauigkeit verwendet wird, z.B. PC bis ca 16 Dezimalstellen.
Matrizenrechner
MatMates Hauptanliegen ist die
Unterstützung bei der Matrizenrechnung.
Über die Grundrechenarten hinaus sind
auch arithmetische Funktionen für Matrizen implementiert, die nicht nur auf
Einzelelementebene, sondern mit der Matrix als Ganzes operieren, wo dies durch
die Definition der Funktion Sinn macht.
Nachdem die Matrix-Multiplikation die
Matrix als Ganzes behandelt, wird dies auch in allen Funktionen so gehandhabt,
die aus der Multiplikation abgeleitet sind, z.B. die exponential- und
trigonometrischen Funktionen, deren Definition in einer Summe aus Produkten
bzw. Quotienten besteht.
Soll eine solche Funktion sich
stattdessen auf die einzelnen Elemente beziehen (z.B. der Logarithmus jedes
einzelnen Elements) muß die Matrix temporär als Array verwendet werden; dies
wird durch den nachgestellten Array-Operator # eingestellt (Beispiele siehe unten).
Anzeigen von Matrizenergebnissen
Alle berechneten Ergebnisse, die in
einer Matrix abgespeichert werden, werden sofort angezeigt. Die Form ist z.Zt.
ein einfaches dezimales-Fixed-Format; dieses kann über den SET-Befehl verändert
werden.
Verbergen/Löschen von Matrizen
Haben einige Matrizen nur temporäre
Funktion, deren Anzeige nicht interessiert, können sie durch den HIDE- bzw
DELETE Befehl scriptgesteuert versteckt bzw. gelöscht werden, wodurch sich das
MatMate - MatShelf lichten läßt. Der Hide-Befehl wird auch implizit
durchgeführt, wenn Sie das Fenster einer angezeigten Matrix schließen.
Ist eine Matrix mit DELETE gelöscht,
kann sie nicht mehr als Quelle in einer Formel verwendet werden, sondern muß
erst wieder durch eine Zuweisung erzeugt werden. Sie können aber eine Matrix
ausblenden ohne sie zu löschen, wenn Sie das Fenster minimieren oder die
HIDE-Funktion verwenden. Durch DISPLAY wird sie wieder angezeigt.
Interaktion mit anderen Programmen
Clipboard
Die Anzeige einer Matrix kann ins
Clipboard übernommen werden; dort liegt dann eine Tabulator-getrennte Form vor,
die z.B. von Excel oder Winword als Tabellenformat erkannt wird. Die von
MatMate verwendeten Dezimalpunkte werden dabei in die für diese Programme
gültige Schreibweise mit Kommas umgewandelt. (Menü MATRIX/KOPIEREN…)
Dateien
Matrizen können aus Dateien gelesen
und geschrieben werden. Dies geht z.zt. im CSV-Format ("comma separated
values"), im Binärformat und Hexadezimal-Textformat, das SPSS®
verwendet (Binär: eine double-Speicherstelle pro Element, am Ende einer Zeile
ein zusätzliches CrLF, pro Matrixzeile eine Dateizeile) sowie die
Ladungsmatrizen meines interaktiven Faktoranalyse-Programms Inside-[R] (z.Zt.
nur lesen).
komplexere Formeln
Genau wie skalare Variable können
Matrizen in komplexen Formeln verwendet werden. Die Rückgabewerte von
Matrixfunktionen sind in der Regel selbst wieder Matrizen, so daß auch alle
Matrix-Funktionen beliebig verschachtelt werden können.
a = {{4,1},{1,5}}
b = m_inv(a)*m_inv( {{5,1},{1,5}}
lad=
m_rot(m_cholesky(m_covar2corr(a)),"PCA")
Zur Unterstützung der Schreibarbeit
gibt es einige Vereinfachungen wie z.B. für die Transposition die
postfix-Notation mit dem Apostroph
b = a *
m_transp(a) // oder 2. Schreibweise:
b = a * a'
oder den Verkettungsoperator, der
Matrizen vertikal aneinanderkettet.
b = a || m_mksp( 1,3 ) ||
m_null(m_like(a))
Einfaches
Beispiel mit Iterationen
Bei Matrizenproblemen muß oft mit
Iterationen gearbeitet werden; bspw. kann man auch die Wurzel einer Matrix mit
dem Newton-Algorithmus finden, wenn man die Division einer Matrix durch eine andere
definiert. In MatMate wird der Divisionsoperator so interpretiert, daß der
Divisor durch seine Inverse ersetzt wird, und der Dividend hiermit multipliziert
wird. (Dies funktioniert u.U. auch mit nicht-quadratischen Matrizen, wenn eine
Pseudoinverse gebildet werden kann). Deshalb kann die Newton-Iteration genau
analog zu dem skalaren Beispiel durchgeführt werden:
Erzeugen einer Matrix, aus der die
Wurzel gezogen werden soll; das ist z.B. grundsätzlich möglich bei einer
Korrelations-Matrix:
// eine 2x2-Korrelationsmatrix erzeugen
CORR = m_mk(2,2,
1,0.8, 0.8,1)
Nun muß ein Anfangswert für WERT
eingestellt werden:
WERT = m_einh(2) // eine 2x2-Einheitsmatrix
Führen Sie den obenstehenden Befehl
aus. WERT wird angezeigt.
Tippen Sie dann die beiden folgenden
Befehle und führen Sie sie zusammen aus (Markierung auf beide Zeilen erweitern
und Alt-R drücken):
TMP = WERT
WERT = (CORR / TMP + TMP) / 2
Die Matrixdivision und -addition,
sowie die skalare Division (aller Elemente durch 2) wird durchgeführt, und ein
neuer Wert für WERT berechnet. Wenn Sie die beiden Zeilen mehrfach
iterieren, erhalten Sie in WERT schließlich eine Matrix, für die
gilt:
CORR = WERT * WERT // nicht transponiert!
und die (symmetrische) Wurzel von CORR
darstellt.
(Für die
Faktorenanalyse mag interessant sein, daß diese eine Ladungsmatrix darstellt,
die für Rotationen zur PCA-Position, Quartimax- oder einer anderen Position
verwendet werden kann - und zwar ebensogut wie eine durch die Cholesky-Zerlegung
gewonnene Ladungsmatrix. Im Gegensatz zu letzterer Zerlegungsart sind bei dem
Newton-verfahren aber keine elementaren Wurzeloperationen notwendig.)
gewöhnliche Probleme
·
Einlesen von Matrizen aus
Dateien funktioniert nicht
Der Befehl
c = M_readCSV("meineCSVdatei.txt")
funktioniert nicht richtig; c wird
nicht angezeigt.
Mögliche Ursache(n):
Die Beispieldaten
liegen im Unterverzeichnis "BEISPIELE" zum Programmverzeichnis. Durch
einen Datei-Öffnen-Befehl wurde das aktuelle Verzeichnis geändert. MatMate
findet dann diese Datei nicht. Geben Sie ggfs. in Ihren Skripten immer den
vollständigen Verzeichnispfad an.
·
Wie oben, aber c hat falsche
Daten
Mögliche Ursache(n):
Das Format der Daten
wurde nicht mit MatMate angelegt und kann nicht gelesen werden. Überprüfen Sie
die Trennersymbole zwischen den Feldern und die Dezimalzeichen. Fehlen führende
Nullen bei Dezimalzahlen ( z.B. .1234 kann nicht gelesen werden)?
Passen Sie die
Optionen für CSV-Daten-einlesen ggfls an.
·
Eine Matrix wird nicht
angezeigt:
Der Befehl
c = A + B + sqrt(E)
funktioniert nicht richtig; c wird
nicht angezeigt.
Mögliche Ursache (n):
Eine der Quellmatrizen
existiert nicht. E ist nicht quadratisch. A, B und E haben nicht dieselbe
Dimensionen. Prüfen Sie diese Möglichkeiten