Dieses Modul stellt grundlegende Matrixoperationen bereit.
Zur Darstellung der zugrundeliegenden Felder nutzen wir Data.Array, zur statischen Typisierung der Zeilen- und Spaltenzahl TypeLevelNat.
- type Nat = Int
- newtype Matrix n m a = MkMatrix {}
- type SqMatrix n a = Matrix n n a
- (!!) ∷ Matrix n m a → (Nat, Nat) → a
- fromArray ∷ Array (Nat, Nat) a → (∀ n m. (ReifyNat n, ReifyNat m) ⇒ Matrix n m a → r) → r
- fromArray' ∷ (∀ n. ReifyNat n ⇒ SqMatrix n a → r) → Array (Nat, Nat) a → r
- fromBase ∷ (ReifyNat n, Ring a) ⇒ a → SqMatrix n a
- numRows ∷ (ReifyNat n, ReifyNat m) ⇒ Matrix n m a → Nat
- numRows' ∷ (ReifyNat n, ReifyNat m) ⇒ Matrix n m a → Proxy n
- numCols ∷ (ReifyNat n, ReifyNat m) ⇒ Matrix n m a → Nat
- numCols' ∷ (ReifyNat n, ReifyNat m) ⇒ Matrix n m a → Proxy m
- withNontrivialRows ∷ (ReifyNat n, ReifyNat m) ⇒ (∀ k. ReifyNat k ⇒ Matrix (S k) m a → r) → Matrix n m a → r
- withNontrivialCols ∷ (ReifyNat n, ReifyNat m) ⇒ (∀ k. ReifyNat k ⇒ Matrix n (S k) a → r) → Matrix n m a → r
- withNontrivialRowsCols ∷ (ReifyNat n, ReifyNat m) ⇒ (∀ k l. (ReifyNat k, ReifyNat l) ⇒ Matrix (S k) (S l) a → r) → Matrix n m a → r
- withSquare ∷ (ReifyNat n, ReifyNat m) ⇒ (∀ k. ReifyNat k ⇒ SqMatrix k a → r) → Matrix n m a → r
- deleteRow ∷ (ReifyNat n, ReifyNat m) ⇒ Nat → Matrix (S n) m a → Matrix n m a
- deleteColumn ∷ (ReifyNat n, ReifyNat m) ⇒ Nat → Matrix n (S m) a → Matrix n m a
- transpose ∷ (ReifyNat n, ReifyNat m) ⇒ Matrix n m a → Matrix m n a
- naiveDeterminant ∷ (ReifyNat n, Ring a) ⇒ SqMatrix n a → a
- prettyMatrix ∷ (ReifyNat n, ReifyNat m, Show a) ⇒ Matrix n m a → String
Typen
type Nat = Int
Approximation an den Typ fuer natuerliche Zahlen (beginnend bei Null),
abweichend vom restlichen Projekt einfach Int
statt Integer
.
Wird zur Indizierung der Matrizen zugrundeliegenden Data.Arrays benutzt.
newtype Matrix n m a
(!!) ∷ Matrix n m a → (Nat, Nat) → a
m !! (i,j) ist der (i,j)-Eintrag der Matrix m. Die Indizierung beginnt bei (0,0).
Konstruktion von Matrizen
fromArray ∷ Array (Nat, Nat) a → (∀ n m. (ReifyNat n, ReifyNat m) ⇒ Matrix n m a → r) → r
Ummantelt ein gegebenes Feld in eine Matrix. Da der Ergebnistyp abhaengig von der Zeilen- und Spaltenanzahl des gegebenen Felds ist, kann die resultierende Matrix aber nicht einfach zurueckgegeben werden, sondern muss an eine polymorphe Continuation uebergeben werden.
fromArray' ∷ (∀ n. ReifyNat n ⇒ SqMatrix n a → r) → Array (Nat, Nat) a → r
Ummantelt ein gegebenes quadratisches Feld in eine quadratische Matrix. Wirft eine Laufzeitausnahme, falls das gegebene Feld nicht quadratisch ist.
Dimensionsabfrage
numRows ∷ (ReifyNat n, ReifyNat m) ⇒ Matrix n m a → Nat
Liefert die Anzahl der Zeilen einer Matrix auf Wertebene. Diese Funktion nutzt nur die gegebenen Typinformationen und betrachtet nicht das zugrundeliegende Feld.
numRows' ∷ (ReifyNat n, ReifyNat m) ⇒ Matrix n m a → Proxy n
Liefert die Anzahl der Zeilen einer Matrix auf Typebene. In das zugrundeliegende Feld wird nicht geschaut.
numCols ∷ (ReifyNat n, ReifyNat m) ⇒ Matrix n m a → Nat
Liefert die Anzahl der Spalten einer Matrix auf Wertebene. Diese Funktion nutzt nur die gegebenen Typinformationen und betrachtet nicht das zugrundeliegende Feld.
numCols' ∷ (ReifyNat n, ReifyNat m) ⇒ Matrix n m a → Proxy m
Liefert die Anzahl der Spalten einer Matrix auf Typebene. In das zugrundeliegende Feld wird nicht geschaut.
Laufzeitpruefungen ueber bestimmte Dimensionseigenschaften
withNontrivialRows ∷ (ReifyNat n, ReifyNat m) ⇒ (∀ k. ReifyNat k ⇒ Matrix (S k) m a → r) → Matrix n m a → r
Bringt die Information darueber, dass die gegebene Matrix mindestens eine Zeile besitzt, aufs Typniveau; ist dem nicht so, wird eine Laufzeitausnahme geworfen.
withNontrivialCols ∷ (ReifyNat n, ReifyNat m) ⇒ (∀ k. ReifyNat k ⇒ Matrix n (S k) a → r) → Matrix n m a → r
Bringt die Information darueber, dass die gegebene Matrix mindestens eine Spalte besitzt, aufs Typniveau; ist dem nicht so, wird eine Laufzeitausnahme geworfen.
withNontrivialRowsCols ∷ (ReifyNat n, ReifyNat m) ⇒ (∀ k l. (ReifyNat k, ReifyNat l) ⇒ Matrix (S k) (S l) a → r) → Matrix n m a → r
Bringt die Information darueber, dass die gegebene Matrix mindestens eine Zeile und eine Spalte besitzt, aufs Typniveau; ist dem nicht so, wird eine Laufzeitausnahme geworfen.
withSquare ∷ (ReifyNat n, ReifyNat m) ⇒ (∀ k. ReifyNat k ⇒ SqMatrix k a → r) → Matrix n m a → r
Bringt die Information darueber, dass die gegebene Matrix quadratisch ist, aufs Typniveau; ist dem nicht so, wird eine Laufzeitausnahme geworfen.
Operationen mit Matrizen
deleteRow ∷ (ReifyNat n, ReifyNat m) ⇒ Nat → Matrix (S n) m a → Matrix n m a
deleteRow i m ist diejenige Untermatrix von m, die aus m durch Streichen der Zeile #i (Zaehlung bei null beginnend) hervorgeht.
deleteColumn ∷ (ReifyNat n, ReifyNat m) ⇒ Nat → Matrix n (S m) a → Matrix n m a
deleteColumn i m ist diejenige Untermatrix von m, die aus m durch Streichen der Spalte #i (Zaehlung bei null beginnend) hervorgeht.
naiveDeterminant ∷ (ReifyNat n, Ring a) ⇒ SqMatrix n a → a
Bestimmt die Determinante ueber die Leibniz-Formel. Hier nur zu Demonstrationszwecken, das restliche Projekt verwendet (eine Vorstufe der) Smithschen Normalform zur Berechnung von Determinanten.
Debugging
prettyMatrix ∷ (ReifyNat n, ReifyNat m, Show a) ⇒ Matrix n m a → String
Formatiert eine Matrix (fuer Debugging-Zwecke).