行列#

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

\[\begin{split} A = \begin{pmatrix} a_{11} & a_{12}\\ a_{21} & a_{22} \end{pmatrix} \end{split}\]
\[ % 太字のalias \newcommand{\b}[1]{\boldsymbol{#1}} % \DeclareMathOperator{\Ker}{\text{Ker}} \DeclareMathOperator{\Im}{\text{Im}} \DeclareMathOperator{\dim}{\text{dim}} \DeclareMathOperator{\rank}{\text{rank}} % \]

行列積#

\[\begin{split} 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} \end{split}\]

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

\[\begin{split} 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} \end{split}\]

ベクトルの直積との関係#

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

\[\begin{split} \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} \end{split}\]

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

行列積と直積の関係

行列\(A, B\)\(i\)番目の列ベクトルを\(\boldsymbol{a}_i, \boldsymbol{b}_i\)とし、行ベクトルを\(\boldsymbol{a}_i^T, \boldsymbol{b}_i^T\)とする。このとき、

\[ A^T B = \sum^n_{i=1} \boldsymbol{a}_i \boldsymbol{b}_i^T \]

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

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

\[\begin{split} \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} \end{split}\]

であり、

\[\begin{split} a_1 = \begin{pmatrix} a_{11} \\ a_{12} \end{pmatrix} , \hspace{1em} b_1^T = \begin{pmatrix} b_{11} & b_{12}\\ \end{pmatrix} \end{split}\]

から

\[\begin{split} \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} \end{split}\]

であるため。

行列積との関係

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

\(n\)次元正方行列\(A, B\)\(i\)番目の列ベクトルを\(\boldsymbol{a}_i, \boldsymbol{b}_i\)とし、行ベクトルを\(\boldsymbol{a}_i^T, \boldsymbol{b}_i^T\)とする。このとき、

\[\begin{split} \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} \end{split}\]
import numpy as np

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

行列と写像#

行列は写像である

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

例:ベクトル\(x\)に行列\(A\)を掛けて\(y\)とする

\[ y = A x \]

\(x\)\(y\)に写す写像(≒関数)が行列\(A\)

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

\[\begin{split} \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} \end{split}\]

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

\[\begin{split} 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} \end{split}\]

を用いて

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

と表すことができる。

行列の計算規則#

行列の和#

\[ A(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]])

べき乗#

\[\begin{split} \begin{align} AA &= A^2\\ AAA &= A^3 \end{align} \end{split}\]
\[\begin{split} \begin{align} A^{n+m} &= A^n + A^m\\ (A^n)^m &= A^{nm} \end{align} \end{split}\]

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

\[\begin{split} \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} \end{split}\]

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

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

\[\begin{split} (\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 \end{split}\]
\[\begin{split} \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 \end{split}\]

行列の転置#

行列の転置の性質

  1. \((A^T)^T = A\)

  2. \((cA + dB)^T = cA^T + dB^T\)

  3. \((AB)^T = B^T A^T\)

  4. \((A^T)^{-1} = (A^{-1})^T\)

  5. \(|A^T| = |A|\)

対称行列#

\[ A^T = A \]

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

可換#

\(AB = BA\)が成り立つとき、\(A\)\(B\)可換であるという

import numpy as np

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

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

ブロック行列#

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

\[\begin{split} 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) \end{split}\]

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

\[\begin{split} 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) \end{split}\]
\[\begin{split} 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) \end{split}\]
\[ 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) \]
\[\begin{split} 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) \end{split}\]

ブロック行列の積#

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

\[\begin{split} 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} \end{split}\]

と分割するとする。ここで\(A_{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}\)で、 \(B_{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}\)である。

このとき、

\[\begin{split} 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} \end{split}\]

が成立する。

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

\[\begin{split} \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} \end{split}\]

となる

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

\[\begin{split} \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} \end{split}\]

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

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

例:

\[\begin{split} M = \begin{pmatrix} I & A\\ O & I \end{pmatrix} \end{split}\]

という行列があるとき、

\[\begin{split} M^2 = \begin{pmatrix} I & A'\\ O & I \end{pmatrix} \end{split}\]

この\(A'\)の部分は\(A^2\)ではなく\(2A\)

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. ある行を\(c\)倍する(\(c \neq 0\)

  3. ある行を\(c\)倍して他の行に加える

列基本変形#

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

  2. ある列を\(c\)倍する(\(c \neq 0\)

  3. ある列を\(c\)倍して他の列に加える

参考文献#