• Gruß zur Stunde,
    da ich durch lineare Algebra viel mit Matrizen zu tun hatte, habe ich mal kurzerhand ein paar Matrizen Funktionen entworfen. Zwar gibt es Eigen4AutoIt schon, allerdings dachte ich mir dass das eine schöne Übung ist. Das primäre Ziel ist es allerdings, einen Matrizenrechner über Restklassenkörpern zu erstellen, da ich keinen wirklich "einfachen" Restklassenkörper-Matrizen Löser fand.
    Derzeit sind folgende Funktionen enthalten:

    Funktionsbeschreibung
    Funktionsname Funktionsweise / Kurzbeschreibung
    _Matrix_AddColumnToMatrixColumn($aMatrix, $aColumn, $dColumn) Addiert auf $aMatrix in Spalte $dColumn die 1-spaltige Matrix $aColumn
    _Matrix_AddRowToMatrixRow($aMatrix, $aRow, $dRow) Addiert auf $aMatrix in Spalte $dRow die 1-zeilige Matrix $aRow
    _Matrix_AddMatrix($aMatrix1, $addMatrix2) Addiert $aMatrix1 zu $aMatrix2
    _Matrix_ExtractRow($aMatrix, $mRow) Extrahiert aus $aMatrix eine 1-zeilige Matrix an Stelle $mRow
    _Matrix_ExtractColumn($aMatrix, $mColumn) Extrahiert aus $aMatrix eine 1-spaltige Matrix an Stelle $mColumn
    _Matrix_GetCofactorMatrix($aMatrix) Gibt die Kofaktormatrix von $aMatrix zurück
    _Matrix_GetAdjugateMatrix($aMatrix) Gibt die (!) Adjunkte (!) von $aMatrix zurück
    _Matrix_GetInverseMatrixWithAdjugate($aMatrix) Berechnung der Inversen von $aMatrix, falls nicht invertierbar -1
    _Matrix_GetDeterminantLaPlace($aMatrix) Bestimmt die Determinante von $aMatrix durch den Laplaceschen Entwicklungssatz
    _Matrix_GetDeterminantGauss($aMatrix) Bestimmt die Determinante von $aMatrix über die Dreiecksform nach Gauß
    _Matrix_MultiplyRowWithScalar($aMatrix, $mRow, $mScalar) Multipliziert alle Einträge der Zeile $mRow mit $mScalar in $aMatrix
    _Matrix_MultiplyColumnWithScalar($aMatrix, $mColumn, $mScalar) Multipliziert alle Einträge der Spalte $mRow mit $mScalar in $aMatrix
    _Matrix_MultiplyWithMatrix($aMartix1, $aMatrix2) Multipliziert $aMatrix1 mit $aMatrix2 nach $aMatrix1 * $aMatrix2 - ACHTUNG, NICHT KOMMUTATIV!
    _Matrix_RemoveRowAndColumn($aMatrix, $mRow, $mColumn) Erstellt eine neue Matrix aus $aMatrix ohne die Zeile $mRow und die Spalte $mColumn
    _Matrix_SubstractMatrix($aMatrix1, $aMatrix2) Subtrahiert $aMatrix2 von $aMatrix1
    _Matrix_SwapRows($aMatrix, $mRow1, $mRow2) Vertauschung der Zeilen $mRow1 und $mRow2 von $aMatrix
    _Matrix_SwapColumns($aMatrix, $mColumn1, $mColumn2) Vertauschung der Zeilen $mColumn1 und $mColumn2 von $aMatrix
    _Matrix_TransposeMatrix($aMatrix) Transponiert $aMatrix


    Rückgabewerte:
    Alle Funktionen sind Call-By-Value geschrieben, das ist sinniger, falls man mit den Matrizen mehrere Operationen durchführen will.
    Die Rückgabewerte werde ich nochmal überarbeiten, derzeit wird -1 zurück gegeben, falls eine Operation nicht erlaubt ist (z.B. unterschiedlich dimensionierte Matrizen addieren / subtrahieren, ...), bzw. die Matrix / Determinante welche ausgerechnet wurde.

    Da die Klausurzeit jetzt los geht, werde ich die UDF erst in den Semesterferien erweitern, geplant ist noch:
    - Gauß-Jordan Algorithmus zum lösen eines LGS
    - Rang einer Matrix bestimmen
    - Rechnen über Restklassekörpern
    - Auskommentierung des Codes
    (- Einen Matrix-Rechner mit GUI)
    (- Rechnen über komplexen Zahlen)
    --- Was euch noch so einfällt

    Falls Fehler gefunden werden bitte sofort mitteilen, ich habe die Funktionen simultan mit einem online Matrix-Solver überprüft, aber vor dem Fehlerteufel ist man ja nie sicher.

    ----------------------------------------
    Mal ein kleiner "Benchmark" Laplace gegenüber Gauß-Algorithmus.
    Bei n <= 4 ist Laplace bis dato noch schneller gewesen (da Regel von Sarrus eingepflegt, sonst wäre er es wohl nicht). Deshalb mal eine 6x6 Matrix gebaut und diese durchrechnen lassen.

    1 -5 9 -13 7 1
    -2 6 -10 12 1 3
    4 -8 14 -16 -1 5
    -3 7 -11 15 8 7
    1 0 -1 3 4 11
    -1 -2 -3 -4 -5 -6


    Die Determinante dieser Matrix ließ ich 100.000 Mal berechnen, einmal mit Gauß und einmal mit Laplace.
    Fazit:
    Laplace benötigte 1128541 Millisekunden, also rund 1128 Sekunden, was 18 Minuten und 48 Sekunden entspricht.
    Gauß dagegen benötigte "gerademal" 81034 Millisekunden, was in etwa 81 Sekunden entspricht.

  • In Analysis haben wir ab und zu mal Adjungierte Matrizen genutzt, ob das in Informatik oder beim Restklassenkörper irgendetwas bringt wage ich mal zu bezweifeln, aber es ist (sobald Komplexe Zahlen unterstützt werden) sehr einfach zu programmieren.

    Ein Klassiker (der auch selten einen praktischen Nutzen hat) ist die Matrixnorm oder allgemeiner eine beliebige p-Norm (und ggf die Spektralnorm).

    Theoretisch gibt es unzählige weitere möglichkeiten Matrizen zu nutzen, aber ich glaube das ist nicht Sinn der Sache hier.

    lg
    M