Matrizen und Arrays

Das Wort „Matrix“ kam 1850 durch James Joseph Sylvester in die Mathematik; ihre Algebra baute sein Freund Arthur Cayley in „A Memoir on the Theory of Matrices“, erschienen 1858 in Band 148 der Philosophical Transactions. In LaTeX erweist sich eine Matrix als gar keine besondere Konstruktion. In amsmath ist pmatrix nichts als \array{*10 c} – ein array mit zehn zentrierten Spalten –, in Klammern gefasst und links wie rechts um 5pt beschnitten. Diese eine Zeile beantwortet die zwei Fragen, mit denen die meisten hier ankommen: warum einer Matrix bei der elften Spalte die Spalten ausgehen und wie sich der Abstand zwischen den Spalten ändern lässt. Diese Seite behandelt die Familie pmatrix, bmatrix, vmatrix und smallmatrix, den Zähler MaxMatrixCols, die array-Umgebung mit \arraycolsep und \arraystretch, erweiterte Matrizen sowie die Punkte \cdots, \vdots, \ddots.

amsmath definiert genau sieben Matrixumgebungen

Es sind matrix, pmatrix, bmatrix, Bmatrix, vmatrix, Vmatrix und smallmatrix. Mit \usepackage{amsmath} stehen sie bereit. Alle werden im Mathematikmodus verwendet; die Einträge werden innerhalb einer Zeile durch & (ein Und-Zeichen) getrennt und Zeilen mit \\ (zwei Backslashes) beendet. Der Inhalt wird jeweils gleich geschrieben; verschieden ist allein der umschließende Begrenzer. Auch die Benennung folgt einer Regel: Der erste Buchstabe nennt den Begrenzer – p für Parenthese, b für Bracket, v für vertical bar. Die großgeschriebenen Bmatrix und Vmatrix liefern das „stärkere“ Paar, geschweifte Klammern und Doppelstriche. Das schlichte matrix fügt gar nichts hinzu.

UmgebungHinzugefügter BegrenzerTypische Verwendung
matrixkeinerGrundlage, wenn ein eigener Begrenzer folgen soll
pmatrixrunde Klammern ( )die gebräuchlichsten Matrizen und Spaltenvektoren
bmatrixeckige Klammern [ ]Matrizen in der Klammerkonvention
Bmatrixgeschweifte Klammern { }wenn geschweifte Klammern gewünscht sind
vmatrixeinfache Striche | |Determinanten
VmatrixDoppelstriche ‖ ‖Normen
smallmatrixkeiner (kompakt)kleine Matrix im Fließtext
latex
% preamble: \usepackage{amsmath}
\[
  \begin{pmatrix} a & b \\ c & d \end{pmatrix}
  \quad
  \begin{bmatrix} a & b \\ c & d \end{bmatrix}
  \quad
  \begin{vmatrix} a & b \\ c & d \end{vmatrix}
\]

Der Inhalt aller sieben Umgebungen wird stets zentriert; rechts- oder linksbündige Spalten lassen sich nicht anfordern. Wer die Ausrichtung selbst bestimmen will, nutzt die unten beschriebene array-Umgebung oder die Sternvarianten aus dem Paket mathtools. mathtools definiert matrix*, pmatrix*, bmatrix*, Bmatrix*, vmatrix*, Vmatrix* und smallmatrix*, jeweils mit einem optionalen [r], [c] oder [l], das alle Spalten entsprechend ausrichtet (Voreinstellung c). Die Sternformen stammen aus mathtools, nicht aus amsmath; nötig ist also \usepackage{mathtools} – und da mathtools amsmath selbst lädt, braucht es beide Zeilen nicht. Begrenzer von Hand mit \left/\right oder \big/\Big zu dehnen, ist Sache der eigenen Seite „Begrenzer“.

Der Matrix gehen die Spalten aus – MaxMatrixCols und die elfte Spalte

Die voreingestellte Obergrenze liegt bei 10 Spalten; eine elfte bricht den Lauf ab mit ! Extra alignment tab has been changed to \cr. TeX erläutert weiter: You have given more \span or & marks than there were in the preamble to the \halign or \valign now in progress. Wer das liest, erkennt: Es ist gar kein „Matrix“-Fehler, sondern der allgemeine Ausrichtungsfehler von \halign. Wie eingangs erwähnt, ist das Innere von pmatrix ein \array{*\c@MaxMatrixCols c}, und Zeile 1077 von amsmath.sty\newcount\c@MaxMatrixCols \c@MaxMatrixCols=10 – legt die Obergrenze fest. Es läuft keine besondere Matrixprüfung; die an array übergebene Spaltenangabe ist schlicht aufgebraucht.

Die Lösung besteht darin, die Grenze mit \setcounter{MaxMatrixCols}{n} anzuheben. Für bis zu zwanzig Spalten schreibt man \setcounter{MaxMatrixCols}{20}. Ein größerer Wert verlängert die an array übergebene Spaltenangabe entsprechend, TeX hat also mehr zu tun; bei etwa 20 ist das auf heutigen Systemen praktisch nicht spürbar. Zurück auf 10 gesetzt, gilt wieder der Ausgangszustand. Zu beachten: Diese Grenze betrifft allein die Matrixumgebungen von amsmath, nicht das array des nächsten Abschnitts. Tatsächlich übersetzte \begin{array}{ccccccccccccccc} mit fünfzehn Spalten ohne jeden Fehler – in array schreibt man einfach so viele Spalten hin, wie gebraucht werden.

latex
% without this line, an 11th column raises
%   ! Extra alignment tab has been changed to \cr.
\setcounter{MaxMatrixCols}{20}
\[
  \begin{pmatrix}
    a_{1} & a_{2} & \cdots & a_{12}
  \end{pmatrix}
\]

Die array-Umgebung: Ausrichtung und Linien selbst bestimmen

array ist ein allgemeines Gitter, das eine Spaltenangabe als obligatorisches Argument entgegennimmt – ein Buchstabe je Spalte: l für linksbündig, c für zentriert, r für rechtsbündig. Ein | zwischen zwei Buchstaben zieht an dieser Stelle eine senkrechte Linie; {l|c|r} bedeutet also drei Spalten: links, Linie, zentriert, Linie, rechts. Es ist das Gegenstück zu tabular für den Mathematikmodus und nur dort verwendbar. Schreibt man \begin{array} außerhalb von \[ \] oder einer equation-Umgebung, versucht LaTeX, in den Mathematikmodus zu wechseln, und meldet ! Missing $ inserted. Die Einträge werden wie in tabular mit & und \\ getrennt, jeder Eintrag wird jedoch als Mathematik im Textstil gesetzt.

array fügt keinen eigenen Begrenzer hinzu; um es als Matrix in Klammern zu fassen, schreibt man \left( … \right) (oder \left[ … \right]) von Hand. Hier lässt sich das eingangs erwähnte „links und rechts um 5pt beschnitten“ nachmessen. Mit dem Inhalt a & b \\ c & d in beiden Fällen ist die Box von \left(\begin{array}{cc} … \end{array}\right) 45,21304pt breit, pmatrix dagegen 35,21304pt. Die Differenz beträgt genau 10pt – zweimal \arraycolsep, der Abstand, den array an jedem Spaltenrand einfügt und der standardmäßig 5pt beträgt. Die Matrixumgebungen von amsmath heben ihn mit je einem \hskip -\arraycolsep am Anfang und am Ende auf. Umgekehrt heißt das: Wer \arraycolsep ändert, ändert auch die Spaltenabstände einer Matrix. Gemessen ergab eine Verkleinerung auf 2pt für pmatrix eine Breite von 29,21304pt, eine Vergrößerung auf 10pt eine von 45,21304pt. Um alle Zeilen gleichmäßig zu dehnen, dient \renewcommand{\arraystretch}{1.5} – bei 1,5 wuchs die Gesamthöhe einer 2×2-Matrix von 24pt auf 36pt, exakt das Anderthalbfache (die Breite bleibt gleich).

latex
% array needs math mode; outside it LaTeX reports "! Missing $ inserted."
\[
  \left(\begin{array}{rrr}
    1 & -2 & 3 \\
    0 & 5 & -1 \\
    4 & 0 & 2
  \end{array}\right)
\]

Die Spaltenangabe lautet hier {rrr}, jede Spalte ist also rechtsbündig, und negative Einträge wie -2 und -1 fluchten am rechten Rand, was sich sauber liest. pmatrix, das stets zentriert, kann das nicht – und genau darum greift man meist überhaupt zu array.

Erweiterte Matrizen: eine senkrechte Linie mittendrin

Man setzt ein | in die Spaltenangabe eines array und fasst das Ganze in \left[ … \right]. In einer erweiterten Matrix – der Darstellung eines linearen Gleichungssystems – steht üblicherweise eine senkrechte Linie zwischen den Koeffizientenspalten und der Spalte der Absolutglieder. Die amsmath-Umgebungen wie bmatrix nehmen keine Spaltenangabe und können sie daher nicht ziehen; hier bewährt sich array. Eine Angabe mit | zwischen Koeffizienten- und Konstantenspalte (etwa {cc|c}) genügt. Für runde Klammern wechselt man zu \left( … \right), für geschweifte zu \left\{ … \right\}. Da \left und \right den Begrenzer auf die Höhe des Inhalts dehnen, bleibt die Form auch bei weiteren Zeilen erhalten (der Dehnmechanismus selbst gehört auf die eigene Seite „Begrenzer“). Auch mathtools bietet handlichere Wege, solche erweiterten Matrizen zu schreiben.

latex
\[
  \left[\begin{array}{cc|c}
    1 & 2 & 5 \\
    3 & 4 & 6
  \end{array}\right]
\]

Eine allgemeine n×n-Matrix schreiben: \cdots, \vdots, \ddots

Die Auslassungspunkte, die „und so weiter“ bedeuten, setzt man als einen Eintrag der Matrix. Es gibt vier, die sich in der Richtung unterscheiden; ausgewählt wird nach der Stelle im Gitter. Alle sind Befehle des Mathematikmodus und brauchen kein zusätzliches Paket.

  • \cdots – waagerechte Punkte auf mittlerer Höhe (⋯), für Auslassungen entlang einer Zeile. Sie liegen auf der Höhe von + und = und passen daher zu einer waagerechten Folge.
  • \vdotssenkrechte Punkte (⋮), für Auslassungen entlang einer Spalte.
  • \ddotsdiagonale Punkte nach rechts unten (⋱), für Auslassungen entlang der Hauptdiagonale.
  • \ldots (und das kontextabhängige \dots) – waagerechte Punkte auf der Grundlinie (…), für Zahlenfolgen oder Indexreihen. In einer Matrix sitzt \cdots meist besser.
latex
\[
  A =
  \begin{pmatrix}
    a_{11} & a_{12} & \cdots & a_{1n} \\
    a_{21} & a_{22} & \cdots & a_{2n} \\
    \vdots & \vdots & \ddots & \vdots \\
    a_{m1} & a_{m2} & \cdots & a_{mn}
  \end{pmatrix}
\]

So schreibt man eine allgemeine m×n-Matrix kanonisch. In der ersten, zweiten und letzten Zeile füllt das \cdots in der dritten Spalte die Lücke zwischen a_{12} und a_{1n}; in der dritten Zeile liefern die \vdots die senkrechte Auslassung je Spalte, das \ddots an der Diagonalstelle die nach rechts unten verlaufende – zusammen heißt das: Zeilen wie Spalten setzen sich entsprechend fort. Soll eine ganze Zeile mit Punkten gefüllt werden, überspannt \hdotsfor{n} aus amsmath die angegebenen n Spalten mit einer Reihe waagerechter Punkte.

Eine Matrix in einer Textzeile: smallmatrix passt in genau eine Zeile

Wirft man eine pmatrix in ein $ … $ im Fließtext, schwillt die Zeilenhöhe an und der Durchschuss ringsum gerät durcheinander. Die Zahlen zeigen, warum: Bei 10pt ist eine 2×2-Matrix in \bigl( … \bigr) 14,5pt hoch und 9,5pt tief, zusammen 24,0pt – genau zweimal der \baselineskip von 12pt. Die smallmatrix-Umgebung von amsmath setzt die Einträge klein und kompakt; derselbe Inhalt in denselben Klammern ergibt 8,5pt Höhe und 3,5pt Tiefe, zusammen 12,0pt, also genau eine Zeile. smallmatrix fügt keinen Begrenzer hinzu; wird einer gebraucht, umschließt man von Hand, etwa mit \bigl( … \bigr). (Auch \left( \right) ist möglich, doch im Fließtext stören die festen Größen \bigl und \bigr den Durchschuss weniger.) Ist mathtools geladen, steht zusätzlich smallmatrix* bereit, das die Spaltenausrichtung wählen lässt.

latex
% preamble: \usepackage{amsmath}
Consider the rotation matrix
$\bigl(\begin{smallmatrix} \cos\theta & -\sin\theta \\ \sin\theta & \cos\theta \end{smallmatrix}\bigr)$
in the plane.