Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

行列

行列はベクトルを集めたもの

A=(a11a12a21a22)A = \begin{pmatrix} a_{11} & a_{12}\\ a_{21} & a_{22} \end{pmatrix}
Undefined control sequence: \DeclareMathOperator at position 50: …dsymbol{#1}}
%
\̲D̲e̲c̲l̲a̲r̲e̲M̲a̲t̲h̲O̲p̲e̲r̲a̲t̲o̲r̲{\Ker}{\text{Ke…

% 太字のalias
\newcommand{\b}[1]{\boldsymbol{#1}}
%
\DeclareMathOperator{\Ker}{\text{Ker}}
\DeclareMathOperator{\Im}{\text{Im}}
\DeclareMathOperator{\dim}{\text{dim}}
\DeclareMathOperator{\rank}{\text{rank}}
%

行列積

A=(a11a12a21a22), B=(b11b12b21b22)A = \begin{pmatrix} a_{11} & a_{12}\\ a_{21} & a_{22} \end{pmatrix}, \ B = \begin{pmatrix} b_{11} & b_{12}\\ b_{21} & b_{22} \end{pmatrix}

とすると、行列積(matrix multiplication)は

AB=(a11a12a21a22)(b11b12b21b22)=(a11b11+a12b21a11b12+a12b22a21b11+a22b21a21b12+a22b22)A B = \begin{pmatrix} a_{11} & a_{12}\\ a_{21} & a_{22} \end{pmatrix} \begin{pmatrix} b_{11} & b_{12}\\ b_{21} & b_{22} \end{pmatrix} = \begin{pmatrix} a_{11} b_{11} + a_{12} b_{21} & a_{11} b_{12} + a_{12} b_{22} \\ a_{21} b_{11} + a_{22} b_{21} & a_{21} b_{12} + a_{22} b_{22} \end{pmatrix}

ベクトルの直積との関係

2つのベクトルa,b\boldsymbol{a}, \boldsymbol{b}のテンソル積

ab=ab=abT=(a1a2an)(b1b2bn)=(a1b1a1b2a1bna2b1a2b2a2bnanb1anb2anbn)\boldsymbol{a} \circ \boldsymbol{b} = \boldsymbol{a} \otimes \boldsymbol{b} = \boldsymbol{a} \boldsymbol{b}^T = \begin{pmatrix} a_1 \\ a_2 \\ \vdots \\ a_n \end{pmatrix} \begin{pmatrix} b_1 & b_2 & \cdots & b_n \end{pmatrix} = \begin{pmatrix} a_1 b_1 & a_1 b_2 & \cdots & a_1 b_n\\ a_2 b_1 & a_2 b_2 & \cdots & a_2 b_n\\ \vdots & \vdots & \ddots & \vdots \\ a_n b_1 & a_n b_2 & \cdots & a_n b_n \end{pmatrix}

直積(direct product)あるいは外積(outer product)という。

行列積と直積の関係

行列A,BA, Bii番目の列ベクトルをai,bi\boldsymbol{a}_i, \boldsymbol{b}_iとし、行ベクトルをaiT,biT\boldsymbol{a}_i^T, \boldsymbol{b}_i^Tとする。このとき、

ATB=i=1naibiTA^T B = \sum^n_{i=1} \boldsymbol{a}_i \boldsymbol{b}_i^T

が成り立つ。この形式は計量経済学(回帰分析)の漸近正規性の証明などで多用される。

(例)A,BR2×2A, B \in \mathbb{R}^{2\times 2}のとき、

ATB=(a11a21a12a22)(b11b12b21b22)=(a11b11+a21b21a11b12+a21b22a12b11+a22b21a12b12+a22b22)\begin{align} A^T B &= \begin{pmatrix} a_{11} & a_{21}\\ a_{12} & a_{22} \end{pmatrix} \begin{pmatrix} b_{11} & b_{12}\\ b_{21} & b_{22} \end{pmatrix} \\ &= \begin{pmatrix} a_{11} b_{11} + a_{21} b_{21} & a_{11} b_{12} + a_{21} b_{22}\\ a_{12} b_{11} + a_{22} b_{21} & a_{12} b_{12} + a_{22} b_{22}\\ \end{pmatrix} \end{align}

であり、

a1=(a11a12),b1T=(b11b12)a_1 = \begin{pmatrix} a_{11} \\ a_{12} \end{pmatrix} , \hspace{1em} b_1^T = \begin{pmatrix} b_{11} & b_{12}\\ \end{pmatrix}

から

i=12aibiT=(a11a12)(b11b12)+(a21a22)(b21b22)=(a11b11a11b12a12b11a12b12)+(a21b21a21b22a22b21a22b22)\begin{align} \sum^2_{i=1} \boldsymbol{a}_i \boldsymbol{b}_i^T &= \begin{pmatrix} a_{11} \\ a_{12} \end{pmatrix} \begin{pmatrix} b_{11} & b_{12} \end{pmatrix} + \begin{pmatrix} a_{21} \\ a_{22} \end{pmatrix} \begin{pmatrix} b_{21} & b_{22} \end{pmatrix} \\ &= \begin{pmatrix} a_{11} b_{11} & a_{11} b_{12}\\ a_{12} b_{11} & a_{12} b_{12} \end{pmatrix} + \begin{pmatrix} a_{21} b_{21} & a_{21} b_{22}\\ a_{22} b_{21} & a_{22} b_{22} \end{pmatrix} \end{align}

であるため。

行列積との関係

行列の一部をベクトルで表して(=ブロック行列)、通常の行列積の定義をベクトルの積の形で表すこともできる

nn次元正方行列A,BA, Bii番目の列ベクトルをai,bi\boldsymbol{a}_i, \boldsymbol{b}_iとし、行ベクトルをaiT,biT\boldsymbol{a}_i^T, \boldsymbol{b}_i^Tとする。このとき、

BA=(b1Tb2TbnT)(a1,a2,,an)=(b1Ta1b1Ta2b1Tanb2Ta1b2Ta2b2TanbnTa1bnTa2bnTan)\begin{align} BA &= \begin{pmatrix} \boldsymbol{b}_{1}^T \\ \boldsymbol{b}_{2}^T \\ \vdots \\ \boldsymbol{b}_{n}^T \end{pmatrix} \begin{pmatrix} \boldsymbol{a}_1, \boldsymbol{a}_2, \cdots, \boldsymbol{a}_n \end{pmatrix} = \begin{pmatrix} \boldsymbol{b}_{1}^T \boldsymbol{a}_1 & \boldsymbol{b}_{1}^T \boldsymbol{a}_2 & \cdots & \boldsymbol{b}_{1}^T \boldsymbol{a}_n\\ \boldsymbol{b}_{2}^T \boldsymbol{a}_1 & \boldsymbol{b}_{2}^T \boldsymbol{a}_2 & \cdots & \boldsymbol{b}_{2}^T \boldsymbol{a}_n\\ \vdots & \vdots & & \vdots\\ \boldsymbol{b}_{n}^T \boldsymbol{a}_1 & \boldsymbol{b}_{n}^T \boldsymbol{a}_2 & \cdots & \boldsymbol{b}_{n}^T \boldsymbol{a}_n\\ \end{pmatrix} \end{align}
import numpy as np

A = np.array([
    [1, 2],
    [3, 4],
])
(A.T @ A).T
array([[10, 14], [14, 20]])

行列と写像

行列は写像である

(平岡和幸, & 堀玄. (2004). プログラミングのための線形代数. 株式会社 オーム社.)

例:ベクトルxxに行列AAを掛けてyyとする

y=Axy = A x

xxyyに写す写像(≒関数)が行列AA

連立一次方程式を行列で表すこともできる。

{a11x1+a12x2++a1mxm=y1a21x1+a22x2++a2mxm=y2an1x1+an2x2++anmxm=yn\begin{cases} \begin{align} a_{11} x_1 + a_{12} x_2 + &\cdots + a_{1m} x_m = y_1\\ a_{21} x_1 + a_{22} x_2 + &\cdots + a_{2m} x_m = y_2\\ &\vdots\\ a_{n1} x_1 + a_{n2} x_2 + &\cdots + a_{nm} x_m = y_n\\ \end{align} \end{cases}

のような連立一次方程式は、

Undefined control sequence: \b at position 198: …, \hspace{1em}
\̲b̲{x} = \begin{pm…

A = \begin{pmatrix}
a_{11} & a_{12} & \cdots & a_{1m} \\
a_{21} & a_{22} & \cdots & a_{2m} \\
\vdots & \vdots & \ddots & \vdots \\
a_{n1} & a_{n2} & \cdots & a_{nm} \\
\end{pmatrix}
, \hspace{1em}
\b{x} = \begin{pmatrix}
x_1\\
x_2\\
\vdots\\
x_m
\end{pmatrix}
, \hspace{1em}
\b{y} = \begin{pmatrix}
y_1\\
y_2\\
\vdots\\
y_n
\end{pmatrix}

を用いて

Undefined control sequence: \b at position 2: A\̲b̲{x} = \b{y}

A\b{x} = \b{y}

と表すことができる。

行列の計算規則

行列の和

A(B+C)=AB+ACA(B+C) = AB + AC
import numpy as np
A = np.array([
    [1, 0],
    [0, 0]
])
B = np.array([
    [2, 0],
    [0, 3]
])
C = np.array([
    [0, -1],
    [-1, 0]
])
A @ (B + C)
array([[ 2, -1], [ 0, 0]])
A @ B + A @ C
array([[ 2, -1], [ 0, 0]])

べき乗

AA=A2AAA=A3\begin{align} AA &= A^2\\ AAA &= A^3 \end{align}
An+m=An+Am(An)m=Anm\begin{align} A^{n+m} &= A^n + A^m\\ (A^n)^m &= A^{nm} \end{align}
adomonition - Unknown Directive
$$
A =
\begin{pmatrix}
1 & 0\\
0 & 0
\end{pmatrix}
\hspace{1em}
A^2 = 
\begin{pmatrix}
1 & 0\\
0 & 0
\end{pmatrix}
\begin{pmatrix}
1 & 0\\
0 & 0
\end{pmatrix}
= 
\begin{pmatrix}
1 & 0\\
0 & 0
\end{pmatrix}
$$


$$
B =
\begin{pmatrix}
2 & 0\\
0 & 3
\end{pmatrix}
\hspace{1em}
B^2 = 
\begin{pmatrix}
2 & 0\\
0 & 3
\end{pmatrix}
\begin{pmatrix}
2 & 0\\
0 & 3
\end{pmatrix}
= 
\begin{pmatrix}
4 & 0\\
0 & 9
\end{pmatrix}
$$

普通の数取は異なる計算規則

(A+B)2=A2+AB+BA+B2(A+B)(AB)=A2AB+BAB2(AB)2=ABAB\begin{align} (A + B)^2 &= A^2 + AB + BA + B^2\\ (A + B) (A - B) &= A^2 - AB + BA - B^2\\ (AB)^2 &= ABAB \end{align}
adomonition - Unknown Directive
$$
A =
\begin{pmatrix}
1 & 0\\
0 & 0
\end{pmatrix}
\hspace{1em}
B =
\begin{pmatrix}
2 & 0\\
0 & 3
\end{pmatrix}
$$

$$
\begin{align}
AB &=
\begin{pmatrix}
1 & 0\\
0 & 0
\end{pmatrix}
\begin{pmatrix}
2 & 0\\
0 & 3
\end{pmatrix}
=
\begin{pmatrix}
2 & 0\\
0 & 0
\end{pmatrix}
\\
(AB)^2 &= 
\begin{pmatrix}
4 & 0\\
0 & 0
\end{pmatrix}
\end{align}
$$

左右を入れ替えなければどこにカッコをつけてもおなじ

例えばベクトルx=(x1,x2,,xn)\boldsymbol{x} = (x_1, x_2, \dots, x_n)について、xxTx\boldsymbol{x} \boldsymbol{x}^T \boldsymbol{x}(xxT)x(\boldsymbol{x} \boldsymbol{x}^T) \boldsymbol{x}と捉えるよりx(xTx)\boldsymbol{x} (\boldsymbol{x}^T \boldsymbol{x})としたほうが楽

(xxT)x=(x12x1x2x1xnx2x1x22x2xnxnx1xnx2xn2)(x1x2xn)=(x12x1+x1x2x2++x1xnxnx2x1x1+x22x2++x2xnxnxnx1x1+xnx2x2++xn2xn)=(x1x2xn)i=1nxi2(\boldsymbol{x} \boldsymbol{x}^T) \boldsymbol{x} = \begin{pmatrix} x_1^2 & x_1 x_2 & \cdots & x_1 x_n\\ x_2 x_1 & x_2^2 & \cdots & x_2 x_n\\ \vdots & \vdots & & \vdots\\ x_n x_1 & x_n x_2 & \cdots & x_n^2 \end{pmatrix} \begin{pmatrix} x_1\\ x_2\\ \vdots\\ x_n \end{pmatrix} = \begin{pmatrix} x_1^2 \cdot x_1 + x_1 x_2 \cdot x_2 + \cdots + x_1 x_n \cdot x_n\\ x_2 x_1 \cdot x_1 + x_2^2 \cdot x_2 + \cdots + x_2 x_n \cdot x_n\\ \vdots\\ x_n x_1 \cdot x_1 + x_n x_2 \cdot x_2 + \cdots + x_n^2 \cdot x_n \end{pmatrix} = \begin{pmatrix} x_1\\ x_2\\ \vdots\\ x_n \end{pmatrix} \sum^n_{i=1} x_i^2
x(xTx)=(x1x2xn)i=1nxi2\boldsymbol{x} (\boldsymbol{x}^T \boldsymbol{x}) = \begin{pmatrix} x_1\\ x_2\\ \vdots\\ x_n \end{pmatrix} \sum^n_{i=1} x_i^2

行列の転置

対称行列

AT=AA^T = A

を満たす正方行列AA対称行列(symmetric matrix)という

可換

AB=BAAB = BAが成り立つとき、AABB可換であるという

import numpy as np

A = np.array([
    [1, 0],
    [0, 1]
])
B = np.array([
    [1, 1],
    [1, 1]
])

(A @ B == B @ A).all()
True

ブロック行列

行列をいくつかのブロック(小行列)に分けて扱うことがある

A=(123456789101112)=(A11A12A21A22)A=\left(\begin{array}{ccccc} 1 & 2 & 3 & \vdots & 4 \\ 5 & 6 & 7 & \vdots & 8 \\ \ldots & \ldots & \ldots & \ldots & \ldots\\ 9 & 10 & 11 & \vdots & 12 \end{array}\right)=\left(\begin{array}{ll} A_{11} & A_{12} \\ A_{21} & A_{22} \end{array}\right)

特に行ベクトルや列ベクトルに分けると扱いやすい

AB=(a1a2am)(b1bl)=(a1b1a1b2a1bιa2b1a2b2a2blamb1amb2ambl)A B=\left(\begin{array}{c} \boldsymbol{a}_1 \\ \boldsymbol{a}_2 \\ \vdots \\ \boldsymbol{a}_m \end{array}\right)\left(\begin{array}{lll} \boldsymbol{b}_1^{\prime} & \cdots & \boldsymbol{b}_l{ }^{\prime} \end{array}\right)=\left(\begin{array}{cccc} \boldsymbol{a}_1 \boldsymbol{b}_1^{\prime} & \boldsymbol{a}_1 \boldsymbol{b}_2^{\prime} & \cdots & \boldsymbol{a}_1 \boldsymbol{b}_\iota{ }^{\prime} \\ \boldsymbol{a}_2 \boldsymbol{b}_1^{\prime} & \boldsymbol{a}_2 \boldsymbol{b}_2^{\prime} & \cdots & \boldsymbol{a}_2 \boldsymbol{b}_l{ }^{\prime} \\ \vdots & \vdots & & \vdots \\ \boldsymbol{a}_m \boldsymbol{b}_1^{\prime} & \boldsymbol{a}_m \boldsymbol{b}_2^{\prime} & \cdots & \boldsymbol{a}_m \boldsymbol{b}_l{ }^{\prime} \end{array}\right)
AB=(a1a2am)B=(a1Ba2BamB)A B=\left(\begin{array}{c} \boldsymbol{a}_1 \\ \boldsymbol{a}_2 \\ \vdots \\ \boldsymbol{a}_m \end{array}\right) B=\left(\begin{array}{c} \boldsymbol{a}_1 B \\ \boldsymbol{a}_2 B \\ \vdots \\ \boldsymbol{a}_m B \end{array}\right)
AB=A(b1b2bl)=(Ab1Ab2Abl)A B=A\left(\begin{array}{llll} \boldsymbol{b}_1{ }^{\prime} & \boldsymbol{b}_2{ }^{\prime} & \cdots & \boldsymbol{b}_l{ }^{\prime} \end{array}\right)=\left(\begin{array}{llll} A \boldsymbol{b}_1{ }^{\prime} & A \boldsymbol{b}_2{ }^{\prime} & \cdots & A \boldsymbol{b}_l{ }^{\prime} \end{array}\right)
AB=(a1a2an)(b1b2bn)=(a1b1+a2b2++anbn)A B=\left(\begin{array}{llll} \boldsymbol{a}_1^{\prime} & \boldsymbol{a}_2^{\prime} & \cdots & \boldsymbol{a}_n{ }^{\prime} \end{array}\right)\left(\begin{array}{c} \boldsymbol{b}_1 \\ \boldsymbol{b}_2 \\ \vdots \\ \boldsymbol{b}_n \end{array}\right)=\left(\boldsymbol{a}_1^{\prime} \boldsymbol{b}_1+\boldsymbol{a}_2^{\prime} \boldsymbol{b}_2+\cdots+\boldsymbol{a}_n{ }^{\prime} \boldsymbol{b}_n\right)

ブロック行列の積

一般に、積が定義可能な行列A,BA, Bに対して

A=(A11A12A21A22),B=(B11B12B21B22)A = \begin{pmatrix} A_{11} & A_{12}\\ A_{21} & A_{22} \end{pmatrix}, \hspace{2em} B = \begin{pmatrix} B_{11} & B_{12}\\ B_{21} & B_{22} \end{pmatrix}

と分割するとする。ここでA11Rs×r,A12Rs×nr,A21Rms×r,A22Rms×nrA_{11} \in \mathbb{R}^{s \times r}, A_{12} \in \mathbb{R}^{s \times n-r}, A_{21} \in \mathbb{R}^{m-s \times r}, A_{22} \in \mathbb{R}^{m-s \times n-r}で、 B11Rr×t,B12Rr×lt,B21Rnr×t,B22Rnr×ltB_{11}\in\mathbb{R}^{r \times t}, B_{12}\in\mathbb{R}^{r \times l-t}, B_{21}\in\mathbb{R}^{n-r \times t}, B_{22}\in\mathbb{R}^{n-r \times l-t}である。

このとき、

AB=(A11A12A21A22)(B11B12B21B22)=(A11B11+A12B21A11B12+A12B22A21B11+A22B21A21B12+A22B22)A B = \begin{pmatrix} A_{11} & A_{12}\\ A_{21} & A_{22} \end{pmatrix} \begin{pmatrix} B_{11} & B_{12}\\ B_{21} & B_{22} \end{pmatrix} = \begin{pmatrix} A_{11} B_{11}+A_{12} B_{21} & A_{11} B_{12}+A_{12} B_{22} \\ A_{21} B_{11}+A_{22} B_{21} & A_{21} B_{12}+A_{22} B_{22} \end{pmatrix}

が成立する。

対角以外のブロック(A12,A21,B12,B21A_{12}, A_{21}, B_{12}, B_{21})が零行列である場合

(A11OOA22)(B11OOB22)=(A11B11OOA22B22)\begin{pmatrix} A_{11} & O\\ O & A_{22} \end{pmatrix} \begin{pmatrix} B_{11} & O\\ O & B_{22} \end{pmatrix} = \begin{pmatrix} A_{11} B_{11} & O \\ O & A_{22} B_{22} \end{pmatrix}

となる

対角以外の部分に零でないブロック*があっても、次のようになる

(A11OA22)(B11OB22)=(A11B11OA22B22)(A11OA22)(B11OB22)=(A11B11OA22B22)\begin{aligned} \begin{pmatrix} A_{11} & O\\ * & A_{22} \end{pmatrix} \begin{pmatrix} B_{11} & O\\ * & B_{22} \end{pmatrix} &= \begin{pmatrix} A_{11} B_{11} & O \\ *' & A_{22} B_{22} \end{pmatrix} \\ \begin{pmatrix} A_{11} & *\\ O & A_{22} \end{pmatrix} \begin{pmatrix} B_{11} & *\\ O & B_{22} \end{pmatrix} &= \begin{pmatrix} A_{11} B_{11} & *' \\ O & A_{22} B_{22} \end{pmatrix} \end{aligned}

ここで左辺の*はブロックのサイズが合えばなんでもよいことを意味し、右辺の*'はそのサイズのある定まった行列を表す(左辺と右辺で*の部分が等しいわけではない)

import numpy as np
np.array([
    [1, 2, 1, 0],
    [3, 4, 0, 1],
    [0, 0, 3, 1],
    [0, 0, 5, 1]
]) @ np.array([
    [1, 1, 1, 0],
    [2, 3, 0, 1],
    [0, 0, 2, 0],
    [0, 0, 0, 1]
])
array([[ 5, 7, 3, 2], [11, 15, 3, 5], [ 0, 0, 6, 1], [ 0, 0, 10, 1]])
np.array([
    [1, 2],
    [3, 4],
]) @ np.array([
    [1, 1],
    [2, 3],
])
array([[ 5, 7], [11, 15]])

例:

M=(IAOI)M = \begin{pmatrix} I & A\\ O & I \end{pmatrix}

という行列があるとき、

M2=(IAOI)M^2 = \begin{pmatrix} I & A'\\ O & I \end{pmatrix}

このAA'の部分はA2A^2ではなく2A2A

import numpy as np
M = np.array([
    [1, 0, 1, 2],
    [0, 1, 3, 4],
    [0, 0, 1, 0],
    [0, 0, 0, 1]
])

M @ M
array([[1, 0, 2, 4], [0, 1, 6, 8], [0, 0, 1, 0], [0, 0, 0, 1]])
# A^2
A = np.array([
    [1, 2],
    [3, 4],
])
A @ A
array([[ 7, 10], [15, 22]])
2 * A
array([[2, 4], [6, 8]])
import numpy as np
M = np.array([
    [1, 0, 1, 2],
    [0, 1, 3, 4],
    [0, 0, 1, 0],
    [0, 0, 0, 1]
])

M @ M @ M
array([[ 1, 0, 3, 6], [ 0, 1, 9, 12], [ 0, 0, 1, 0], [ 0, 0, 0, 1]])
import numpy as np
M = np.array([
    [1, 0, 0, 1, 2, 3],
    [0, 1, 0, 4, 5, 6],
    [0, 0, 1, 7, 8, 9],
    [0, 0, 0, 1, 0, 0],
    [0, 0, 0, 0, 1, 0],
    [0, 0, 0, 0, 0, 1]
])

M @ M
array([[ 1, 0, 0, 2, 4, 6], [ 0, 1, 0, 8, 10, 12], [ 0, 0, 1, 14, 16, 18], [ 0, 0, 0, 1, 0, 0], [ 0, 0, 0, 0, 1, 0], [ 0, 0, 0, 0, 0, 1]])
import numpy as np
M = np.array([
    [0, 0, 1, 2],
    [0, 0, 3, 4],
    [1, 0, 0, 0],
    [0, 1, 0, 0]
])

M @ M
array([[1, 2, 0, 0], [3, 4, 0, 0], [0, 0, 1, 2], [0, 0, 3, 4]])
import numpy as np
M = np.array([
    [0, 0, -1, 0],
    [0, 0, 0, 1],
    [1, 0, 0, 0],
    [0, -1, 0, 0]
])

M @ M
array([[-1, 0, 0, 0], [ 0, -1, 0, 0], [ 0, 0, -1, 0], [ 0, 0, 0, -1]])
import numpy as np
M = np.array([
    [0, 0, 0, -1],
    [0, 0, -1, 0],
    [1, 0, 0, 0],
    [0, 1, 0, 0]
])

M @ M
array([[ 0, -1, 0, 0], [-1, 0, 0, 0], [ 0, 0, 0, -1], [ 0, 0, -1, 0]])

基本変形

行基本変形

  1. 2つの行を入れ替える

  2. ある行をcc倍する(c0c \neq 0

  3. ある行をcc倍して他の行に加える

列基本変形

  1. 2つの列を入れ替える

  2. ある列をcc倍する(c0c \neq 0

  3. ある列をcc倍して他の列に加える