行列#

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

A=(a11a12a21a22)

行列積#

A=(a11a12a21a22), B=(b11b12b21b22)

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

AB=(a11a12a21a22)(b11b12b21b22)=(a11b11+a12b21a11b12+a12b22a21b11+a22b21a21b12+a22b22)

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

2つのベクトルa,bのテンソル積

ab=ab=abT=(a1a2an)(b1b2bn)=(a1b1a1b2a1bna2b1a2b2a2bnanb1anb2anbn)

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

行列積と直積の関係

行列A,Bi番目の列ベクトルをai,biとし、行ベクトルをaiT,biTとする。このとき、

ATB=i=1naibiT

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

(例)A,BR2×2のとき、

ATB=(a11a21a12a22)(b11b12b21b22)=(a11b11+a21b21a11b12+a21b22a12b11+a22b21a12b12+a22b22)

であり、

a1=(a11a12),b1T=(b11b12)

から

i=12aibiT=(a11a12)(b11b12)+(a21a22)(b21b22)=(a11b11a11b12a12b11a12b12)+(a21b21a21b22a22b21a22b22)

であるため。

行列積との関係

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

n次元正方行列A,Bi番目の列ベクトルをai,biとし、行ベクトルをaiT,biTとする。このとき、

BA=(b1Tb2TbnT)(a1,a2,,an)=(b1Ta1b1Ta2b1Tanb2Ta1b2Ta2b2TanbnTa1bnTa2bnTan)
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=Ax

xyに写す写像(≒関数)が行列A

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

{a11x1+a12x2++a1mxm=y1a21x1+a22x2++a2mxm=y2an1x1+an2x2++anmxm=yn

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

A=(a11a12a1ma21a22a2man1an2anm),x=(x1x2xm),y=(y1y2yn)

を用いて

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

べき乗#

AA=A2AAA=A3
An+m=An+Am(An)m=Anm

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

(A+B)2=A2+AB+BA+B2(A+B)(AB)=A2AB+BAB2(AB)2=ABAB

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

例えばベクトルx=(x1,x2,,xn)について、xxTx(xxT)xと捉えるよりx(xTx)としたほうが楽

(xxT)x=(x12x1x2x1xnx2x1x22x2xnxnx1xnx2xn2)(x1x2xn)=(x12x1+x1x2x2++x1xnxnx2x1x1+x22x2++x2xnxnxnx1x1+xnx2x2++xn2xn)=(x1x2xn)i=1nxi2
x(xTx)=(x1x2xn)i=1nxi2

行列の転置#

行列の転置の性質

  1. (AT)T=A

  2. (cA+dB)T=cAT+dBT

  3. (AB)T=BTAT

  4. (AT)1=(A1)T

  5. |AT|=|A|

対称行列#

AT=A

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

可換#

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

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)

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

AB=(a1a2am)(b1bl)=(a1b1a1b2a1bιa2b1a2b2a2blamb1amb2ambl)
AB=(a1a2am)B=(a1Ba2BamB)
AB=A(b1b2bl)=(Ab1Ab2Abl)
AB=(a1a2an)(b1b2bn)=(a1b1+a2b2++anbn)

ブロック行列の積#

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

A=(A11A12A21A22),B=(B11B12B21B22)

と分割するとする。ここでA11Rs×r,A12Rs×nr,A21Rms×r,A22Rms×nrで、 B11Rr×t,B12Rr×lt,B21Rnr×t,B22Rnr×ltである。

このとき、

AB=(A11A12A21A22)(B11B12B21B22)=(A11B11+A12B21A11B12+A12B22A21B11+A22B21A21B12+A22B22)

が成立する。

対角以外のブロック(A12,A21,B12,B21)が零行列である場合

(A11OOA22)(B11OOB22)=(A11B11OOA22B22)

となる

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

(A11OA22)(B11OB22)=(A11B11OA22B22)(A11OA22)(B11OB22)=(A11B11OA22B22)

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

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)

という行列があるとき、

M2=(IAOI)

このAの部分はA2ではなく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倍する(c0

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

列基本変形#

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

  2. ある列をc倍する(c0

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

参考文献#