Matrix

Contents

Description

Dieses Modul stellt grundlegende Matrixoperationen bereit.

Zur Darstellung der zugrundeliegenden Felder nutzen wir Data.Array, zur statischen Typisierung der Zeilen- und Spaltenzahl TypeLevelNat.

Synopsis

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

Typ der (n x m)-Matrizen ueber a. Die Indizierung der zugrundeliegenden Felder beginnt bei (0,0), Matrizen mit null Zeilen oder Spalten sind zugelassen.

Die Typen n und m sollten der ReifyNat-Klasse angehoeren.

Da wir den MkMatrix-Konstruktor exportieren, kann man den statischen Schutz ueberwinden.

Constructors

MkMatrix 

Fields

unMatrix ∷ Array (Nat, Nat) a
 

Instances

Functor (Matrix n m) 
(ReifyNat n, Ring a) ⇒ Ring (SqMatrix n a) 
Eq a ⇒ Eq (Matrix n m a) 
Show a ⇒ Show (Matrix n m a) 
(ReifyNat n, ReifyNat m, Arbitrary a) ⇒ Arbitrary (Matrix n m a) 

type SqMatrix n a = Matrix n n a

Typ der quadratischen n x n-Matrizen ueber a. Der Typ n sollte der ReifyNat-Klasse angehoeren.

Die Ring-Instanz von SqMatrix n ist eine Luege, da diese die Multiplikation als kommutativ voraussetzt. Sie wird nur in Smith fuer eine QuickCheck-Eigenschaft verwendet.

(!!)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.

fromBase ∷ (ReifyNat n, Ring a) ⇒ a → SqMatrix n a

'fromBase x' ist das x-fache der Einheitsmatrix.

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) ⇒ NatMatrix (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) ⇒ NatMatrix 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.

transpose ∷ (ReifyNat n, ReifyNat m) ⇒ Matrix n m a → Matrix m n a

Bestimmt die Transponierte.

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).