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