행렬과 배열

“행렬(matrix)”이라는 말을 수학에 들여온 사람은 1850년의 제임스 조지프 실베스터이고, 그 대수를 세운 것은 친구 아서 케일리가 1858년 왕립학회 철학회보 148권에 실은 「A Memoir on the Theory of Matrices」였습니다. LaTeX에서 이 행렬은 사실 특별한 구조가 아닙니다. amsmath의 pmatrix의 속은 \array{*10 c}, 곧 “가운데 정렬 열 열 개를 가진 array”에 괄호를 씌우고 좌우 여백을 5pt씩 깎은 것일 뿐입니다. 이 한 줄이 사람들이 가장 자주 들고 오는 두 가지 의문——“행렬의 열이 모자란다(열한 번째 열에서 오류가 난다)”, “열 간격을 어떻게 바꾸나”——의 답을 그대로 줍니다. 이 페이지에서는 pmatrix, bmatrix, vmatrix, smallmatrix 일가와 MaxMatrixCols, array 환경과 \arraycolsep·\arraystretch, 증강 행렬, 그리고 \cdots, \vdots, \ddots를 다룹니다.

amsmath이 정의하는 행렬 환경은 일곱 개뿐

matrix, pmatrix, bmatrix, Bmatrix, vmatrix, Vmatrix, smallmatrix 일곱 개입니다. \usepackage{amsmath}를 쓰면 사용할 수 있습니다. 모두 수식 모드 안에서 쓰며, 원소는 가로 방향을 &(앰퍼샌드), 행의 끝을 \\(백슬래시 두 개) 로 구분합니다. 내용을 쓰는 방식은 완전히 같고, 다른 것은 감싸는 구분 기호뿐입니다. 이름 짓는 방식도 규칙적이어서, 첫 글자가 괄호의 종류를 나타냅니다. p는 둥근 괄호(parenthesis), b는 각괄호(bracket), v는 세로줄(vertical bar)입니다. 대문자로 시작하는 BmatrixVmatrix는 “강한” 쪽, 곧 중괄호와 이중 세로줄이 됩니다. 맨 matrix는 아무것도 붙이지 않습니다.

환경붙는 구분 기호주된 용도
matrix없음구분 기호를 직접 붙이고 싶을 때의 바탕
pmatrix둥근 괄호 ( )가장 일반적인 행렬과 열벡터
bmatrix각괄호 [ ]각괄호 관례로 쓰는 행렬
Bmatrix중괄호 { }중괄호로 감싸고 싶을 때
vmatrix세로줄 | |행렬식
Vmatrix이중 세로줄 ‖ ‖노름
smallmatrix없음(소형)본문 줄 안에 넣는 작은 행렬
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}
\]

이 일곱 환경의 내용은 항상 가운데 정렬이며, 오른쪽이나 왼쪽 정렬은 지정할 수 없습니다. 열 정렬을 직접 정하고 싶다면 뒤에 나오는 array 환경을 쓰거나, mathtools 패키지별표판을 씁니다. mathtools는 matrix*, pmatrix*, bmatrix*, Bmatrix*, vmatrix*, Vmatrix*, smallmatrix*를 정의하며, 모두 선택적 인수 [r][c][l]을 받아 모든 열을 그 방향으로 정렬합니다(기본값은 c). 별표판은 amsmath가 아니라 mathtools의 것이므로 \usepackage{mathtools}가 필요합니다. mathtools가 스스로 amsmath을 읽어들이므로 두 줄을 다 쓸 필요는 없습니다. \left\right\big\Big으로 구분 기호를 손수 늘이는 이야기는 별도 페이지 “구분 기호”가 담당합니다.

행렬의 열이 모자랍니다 — MaxMatrixCols와 열한 번째 열의 오류

기본 상한은 10열이며, 열한 번째 열을 쓰면 ! Extra alignment tab has been changed to \cr.로 멈춥니다. TeX은 이어서 You have given more \span or & marks than there were in the preamble to the \halign or \valign now in progress.라고 설명합니다. 읽어 보면 알 수 있듯 이것은 “행렬”의 오류가 아니라 표 조판(\halign) 일반의 오류입니다. 앞서 말한 대로 pmatrix의 속은 \array{*\c@MaxMatrixCols c}이고, amsmath.sty 1077행의 \newcount\c@MaxMatrixCols \c@MaxMatrixCols=10이 열 수의 상한을 정하기 때문입니다. 행렬만을 위한 특별한 검사가 도는 것이 아니라, array에 넘긴 열 지정을 다 써 버렸을 뿐입니다.

해결은 \setcounter{MaxMatrixCols}{n}으로 상한을 올리는 것입니다. 20열까지 허용하려면 \setcounter{MaxMatrixCols}{20}이라고 씁니다. 값을 키우면 array에 넘기는 열 지정이 그만큼 길어져 TeX의 일이 늘지만, 20 정도라면 현대 환경에서 실용상의 영향은 거의 없습니다. 되돌리려면 10으로 되돌립니다. 참고로 이 상한은 amsmath의 행렬 환경에만 해당하며 다음 절의 array에는 걸리지 않습니다. 실제로 \begin{array}{ccccccccccccccc}로 15열을 늘어놓아도 아무 오류도 나지 않았습니다. 열 지정에 필요한 만큼 쓰면 되기 때문입니다.

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

array 환경 — 정렬과 괘선을 직접 정하기

array열 지정을 필수 인수로 받는 범용 격자로, 열 하나에 문자 하나를 씁니다. l은 왼쪽 정렬, c는 가운데, r은 오른쪽 정렬입니다. 문자 사이에 |를 두면 그 자리에 세로 괘선이 그어지므로, {l|c|r}은 “왼쪽·괘선·가운데·괘선·오른쪽”의 세 열입니다. 본문 표를 조판하는 tabular의 수식판에 해당하며, 수식 모드 안에서만 쓸 수 있습니다. \[ \]equation 환경 밖에서 \begin{array}라고 쓰면 LaTeX이 수식 모드로 들어가려 하면서 ! Missing $ inserted.를 냅니다. 원소의 구분은 tabular와 같이 &\\이지만, 각 원소는 텍스트 스타일의 수식으로 조판됩니다.

array는 스스로 구분 기호를 붙이지 않으므로, 행렬로서 괄호로 감싸려면 \left( … \right)(또는 \left[ … \right])를 손으로 씁니다. 여기서 서두에 말한 “좌우를 5pt씩 깎는다”의 뜻을 재어 확인할 수 있습니다. 내용을 둘 다 a & b \\ c & d로 맞추어 재면 \left(\begin{array}{cc} … \end{array}\right)의 상자는 너비 45.21304pt, pmatrix는 35.21304pt입니다. 차이는 정확히 10pt로, array가 열 양끝에 넣는 여백 \arraycolsep(기본 5pt) 두 개분입니다. amsmath의 행렬 환경은 시작과 끝에 \hskip -\arraycolsep을 넣어 이 여백을 지웁니다. 뒤집어 보면 \arraycolsep을 바꾸면 행렬의 열 간격도 바뀝니다. 실측에서도 2pt로 줄이면 pmatrix의 너비가 29.21304pt, 10pt로 넓히면 45.21304pt가 되었습니다. 행 높이를 일률적으로 늘이고 싶을 때는 \renewcommand{\arraystretch}{1.5}입니다. 1.5로 하니 2×2의 총 높이가 24pt에서 36pt로 정확히 1.5배가 되었습니다(너비는 변하지 않습니다).

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

이 예의 열 지정은 {rrr}이므로 모든 열이 오른쪽 정렬이 되어, -2-1 같은 음수 원소가 오른쪽 끝에서 나란히 맞아 읽기 쉬워집니다. 늘 가운데 정렬인 pmatrix로는 할 수 없는 일이며, array를 고르는 이유는 대개 이것입니다.

증강 행렬 — 세로 괘선을 중간에 한 줄

array의 열 지정에 |를 넣고 전체를 \left[ … \right]로 감쌉니다. 연립일차방정식을 나타내는 증강 행렬에서는 계수 열과 상수 열 사이에 세로 괘선을 긋는 것이 관례입니다. bmatrix 같은 amsmath 행렬 환경은 열 지정을 받지 않으므로 이 괘선을 스스로 그을 수 없습니다. 여기서 array가 제 몫을 합니다. 계수 열과 상수 열 사이에 |를 둔 지정(예컨대 {cc|c})을 쓰면 그만입니다. 둥근 괄호로 하고 싶으면 \left( … \right), 중괄호라면 \left\{ … \right\}로 바꿉니다. \left\right는 내용 높이에 맞추어 괄호를 늘이므로, 행을 늘려도 모양이 무너지지 않습니다(늘이는 구조 자체는 별도 페이지 “구분 기호”가 담당합니다). 참고로 mathtools에는 이런 증강 행렬을 더 수월하게 쓰는 장치도 마련되어 있습니다.

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

일반적인 n×n 행렬 쓰기 — \cdots, \vdots, \ddots

생략을 뜻하는 점들을 행렬의 한 원소로 놓습니다. 방향이 다른 네 가지가 있으며, 격자 안에서 어디에 놓이느냐로 골라 씁니다. 모두 수식 모드 명령이며 추가 패키지가 필요 없습니다.

  • \cdots가운데 높이의 수평 점(⋯). 행을 따르는 생략에 씁니다. +=와 같은 높이에 놓이므로 가로 방향의 연쇄에 잘 어울립니다.
  • \vdots세로 점(⋮). 열을 따르는 생략에 씁니다.
  • \ddots — 오른쪽 아래로 내려가는 대각 점(⋱). 주대각선을 따르는 생략에 씁니다.
  • \ldots(및 문맥으로 판단하는 \dots) — 기준선의 수평 점(…). 수의 나열이나 첨자의 열에 씁니다. 행렬 안에서는 대개 \cdots 쪽이 더 잘 어울립니다.
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 행렬을 쓰는 정석입니다. 첫째·둘째·마지막 행에서는 세 번째 열의 \cdotsa_{12}a_{1n} 사이의 생략을 채우고, 셋째 행에서는 각 열의 \vdots가 세로 생략을, 대각 위치의 \ddots가 오른쪽 아래로 내려가는 생략을 나타냅니다. 행도 열도 마찬가지로 이어진다는 뜻입니다. 한 행 전체를 점으로 채우고 싶다면 amsmath의 \hdotsfor{n}이 지정한 n개 열을 수평 점으로 가로지릅니다.

본문 줄에 행렬 넣기 — smallmatrix는 딱 한 줄분

본문의 $ … $pmatrix를 떨어뜨리면 줄 높이가 부풀어 주위 행간이 흐트러집니다. 숫자를 보면 이유가 분명합니다. 10pt 조판에서 \bigl( … \bigr)에 넣은 2×2 행렬은 높이 14.5pt·깊이 9.5pt로 합계 24.0pt——\baselineskip 12pt의 정확히 두 줄분을 차지해 버립니다. amsmath의 smallmatrix 환경은 원소를 작고 조밀하게 조판하여, 같은 괄호에 넣은 같은 내용이 높이 8.5pt·깊이 3.5pt의 합계 12.0pt, 곧 딱 한 줄분에 들어갑니다. smallmatrix는 구분 기호를 붙이지 않으므로 필요하면 \bigl( … \bigr)처럼 손수 감쌉니다(\left( \right)로도 감쌀 수 있지만, 본문 안에서는 고정 크기인 \bigl\bigr가 행간을 덜 흐트러뜨립니다). mathtools를 읽어들였다면 열 정렬을 고를 수 있는 smallmatrix*도 쓸 수 있습니다.

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.