矩阵与数组

矩阵、向量以及任何按网格排布的数学内容,可以用 amsmath 包的矩阵环境pmatrix 等)来排,也可以用更通用的 array 环境。二者写法相近:元素用 & 横向分隔,用 \\ 换到下一行;区别在于是否自动加定界符,以及能否自由控制列对齐。本页依次介绍矩阵环境家族及其适用场景、可自行指定列对齐和竖线的 array、增广矩阵的写法,以及矩阵中表示“依此类推”的点号 \cdots\vdots\ddots

amsmath 的矩阵环境

排矩阵最简单的方法,是使用 amsmath 包提供的一组矩阵环境;在导言区写上 \usepackage{amsmath} 即可使用。它们都在数学模式中使用,元素在同一行内用 &(ampersand)分隔,行末用 \\(两个反斜杠)换行。不同环境之间唯一的区别,是包围矩阵的定界符;内部内容的写法完全相同。

这些名称有固定规律。开头字母表示定界符:p 是 parentheses(圆括号),b 是 brackets(方括号),v 是 vertical bar(竖线)。以大写开头的 BmatrixVmatrix 分别对应“更强”的花括号和双竖线。普通的 matrix 不添加任何定界符。

环境添加的定界符典型用途
matrix要自行添加定界符时的基础
pmatrix圆括号 ( )最常见的矩阵和列向量
bmatrix方括号 [ ]矩阵(偏好方括号的写法)
Bmatrix花括号 { }需要表示集合式整体时
vmatrix单竖线 | |行列式
Vmatrix双竖线 ‖ ‖范数
smallmatrix无(紧凑)嵌入正文中的小矩阵

下面的例子用 pmatrixbmatrixvmatrix 排同一个 2×2 内容。\\ 前后的空格和换行不会影响输出,因此源码可以按易读的方式排版。

latex
\[
  \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}
\]

输出结果是在单独一行居中放置三个 2×2 矩阵,并用 \quad 拉开间距:第一个用圆括号包围,第二个用方括号,第三个左右为竖线,表示行列式。元素居中对齐,abcd 作为变量以斜体排出。

注意,矩阵环境中的元素始终居中;不能要求列右对齐或左对齐。需要自行选择对齐方式时,可以使用后文的 array 环境,或使用 mathtools 包提供的星号版本pmatrix*bmatrix* 等)。星号版本接受 [r][c][l] 可选参数,使所有列按该方向对齐,例如 \begin{pmatrix*}[r] … \end{pmatrix*}

列数上限(MaxMatrixCols)

amsmath 的矩阵环境默认最多只能排 10 列。这是因为名为 MaxMatrixCols 的计数器初值设为 10。如果尝试排 11 列或更多列的矩阵,就会得到列数过多的错误。

需要更多列时,用 \setcounter{MaxMatrixCols}{n} 提高这个上限。例如要允许最多 20 列,可以如下书写。更大的值会让 LaTeX 做更多处理,但在现代 TeX 环境中,20 左右通常几乎没有实际影响。若要恢复原状,把值重新设为 10 即可。

latex
\setcounter{MaxMatrixCols}{20}
\[
  \begin{pmatrix}
    a_{1} & a_{2} & \cdots & a_{12}
  \end{pmatrix}
\]

这个上限只影响 amsmath 的矩阵环境,不适用于下面要讲的 array 环境;在 array 中,只要在列说明里写出所需数量的列即可。

array 环境

array 环境是一种通用网格,可以自行指定对齐方式和线条。它是正文表格环境 tabular 的数学模式版本,只能在数学模式中使用(放在 \[ \]equation 环境内)。元素和 tabular 一样用 &\\ 分隔,但每个元素都会作为数学内容(以文本样式)排出。

array 有一个必需参数,称为列说明。像 {ccc} 这样,每一列写一个表示对齐方式的字母:l 表示左对齐,c 表示居中,r 表示右对齐。在字母之间放入 |,就会在该位置画出竖线。因此 {l|c|r} 表示三列:左对齐、竖线、居中、竖线、右对齐。

array 本身不会添加定界符。若要把它作为矩阵用括号包围,需要手动写成 \left( … \right)(或 \left[ … \right] 等)。\left\right 会根据内容高度自动伸缩定界符,因此即使矩阵有很多行,括号也能整齐覆盖整块内容。这相当于把 amsmath 矩阵环境在内部自动完成的事手动写出来。

latex
\[
  \left(\begin{array}{rrr}
    1 & -2 & 3 \\
    0 & 5 & -1 \\
    4 & 0 & 2
  \end{array}\right)
\]

这个例子输出一个用圆括号包围的 3×3 矩阵。由于列说明是 {rrr},各列都右对齐,因此 -2-1 这样的负数也能在右侧对齐,读起来更整齐。重点在于,pmatrix 总是居中,而 array 可以选择对齐方式。

增广矩阵(带竖线)

像表示线性方程组的增广矩阵那样,有时需要在矩阵中间加入竖线。amsmath 的 bmatrix 等环境不接受列说明,因此无法画出竖线;但 array 列说明中的 | 可以做到。在系数列和常数列之间放入 | 的列说明(例如 {cc|c}),再用 \left[ … \right] 包住整体即可。

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

这会输出一个用方括号包围的两行增广矩阵,在第 2 列和第 3 列之间画出一条竖线。左侧的 1 2 / 3 4 是系数矩阵,竖线右侧的 5 / 6 是常数列。由于 \left[\right] 会按内容高度伸展方括号,即使增加行数也不会破坏外观。

若要用圆括号做同样的事,只需改成 \left( … \right);若要用花括号,则改成 \left\{ … \right\}。(mathtools 包也提供了更简洁书写这类增广矩阵的方法。)

矩阵中的点号(…、⋮、⋱)

写一般的 n×n 矩阵时,表示“依此类推”的省略点不可缺少。LaTeX 提供四种方向不同的点号,需要根据它们在矩阵中的位置来选择。它们都是数学模式命令。

  • \cdots — 位于中线高度的横向三点(⋯),用于省略同一行中的若干元素。它们与 += 处在相近高度,适合横向连续内容。
  • \vdots竖向三点(⋮),用于省略列方向的内容。
  • \ddots — 向右下延伸的对角三点(⋱),用于省略主对角线方向的内容。
  • \ldots(以及会随上下文选择的 \dots)— 位于基线上的横向三点(…),用于数字或下标序列。矩阵中通常 \cdots 更好看。

标准用法是把 \cdots 作为横向省略、\vdots 作为纵向省略、\ddots 作为对角线省略,分别当作矩阵元素来放置。下面是用 pmatrix 写一般 n×n 矩阵的典型例子。

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}
\]

这会输出一个用圆括号包围的 m×n 矩阵。在第一行、第二行和最后一行中,第 3 列的 \cdots 用中线高度的横向点填补 a_{12}a_{1n} 之间的间隔;第三行中,各列的 \vdots 是竖向点,对角位置的 \ddots 是向右下的斜向点,共同表示“行和列都按同样方式继续”。a_{11} 这样的下标通过 _ 排成下标。

如果想用点线填满整行,可以使用 amsmath 的 \hdotsfor{n},它会用一排横向点跨过指定的 n 列。

正文中的小矩阵(smallmatrix)

pmatrix 等放进行内公式(正文中的 $ … $)会大幅撑高该行,打乱前后行距。若要在正文流中嵌入一个小矩阵,使用 amsmath 的 smallmatrix 环境。它会把元素排得小而紧凑,几乎不破坏行高。

smallmatrix 本身不加定界符,因此需要括号时要手动包住,例如 \bigl( … \bigr)。(也可以用 \left( \right),但在行内公式中,固定尺寸的 \bigl\bigr 往往更不容易扰乱行距。)

latex
回転行列 $\bigl(\begin{smallmatrix} \cos\theta & -\sin\theta \\ \sin\theta & \cos\theta \end{smallmatrix}\bigr)$ を考える。

这会在正文的一行中放入一个用圆括号包围的小型 2×2 旋转矩阵,几乎不扰乱行高。\cos\sin 会作为正体函数名排出。