行列はベクトルを集めたもの
A=(a11a21a12a22) 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=(a11a21a12a22), B=(b11b21b12b22) とすると、行列積(matrix multiplication)は
AB=(a11a21a12a22)(b11b21b12b22)=(a11b11+a12b21a21b11+a22b21a11b12+a12b22a21b12+a22b22) ベクトルの直積との関係¶
2つのベクトルa,bのテンソル積
a∘b=a⊗b=abT=⎝⎛a1a2⋮an⎠⎞(b1b2⋯bn)=⎝⎛a1b1a2b1⋮anb1a1b2a2b2⋮anb2⋯⋯⋱⋯a1bna2bn⋮anbn⎠⎞ を直積(direct product)あるいは外積(outer product)という。
行列積と直積の関係
行列A,Bのi番目の列ベクトルをai,biとし、行ベクトルをaiT,biTとする。このとき、
ATB=i=1∑naibiT が成り立つ。この形式は計量経済学(回帰分析)の漸近正規性の証明などで多用される。
(例)A,B∈R2×2のとき、
ATB=(a11a12a21a22)(b11b21b12b22)=(a11b11+a21b21a12b11+a22b21a11b12+a21b22a12b12+a22b22) であり、
a1=(a11a12),b1T=(b11b12) から
i=1∑2aibiT=(a11a12)(b11b12)+(a21a22)(b21b22)=(a11b11a12b11a11b12a12b12)+(a21b21a22b21a21b22a22b22) であるため。
行列積との関係
行列の一部をベクトルで表して(=ブロック行列)、通常の行列積の定義をベクトルの積の形で表すこともできる
n次元正方行列A,Bのi番目の列ベクトルをai,biとし、行ベクトルをaiT,biTとする。このとき、
BA=⎝⎛b1Tb2T⋮bnT⎠⎞(a1,a2,⋯,an)=⎝⎛b1Ta1b2Ta1⋮bnTa1b1Ta2b2Ta2⋮bnTa2⋯⋯⋯b1Tanb2Tan⋮bnTan⎠⎞ import numpy as np
A = np.array([
[1, 2],
[3, 4],
])
array([[10, 14],
[14, 20]])
行列と写像¶
行列は写像である
(平岡和幸, & 堀玄. (2004). プログラミングのための線形代数. 株式会社 オーム社.)
例:ベクトルxに行列Aを掛けてyとする
xをyに写す写像(≒関数)が行列A
連立一次方程式を行列で表すこともできる。
⎩⎨⎧a11x1+a12x2+a21x1+a22x2+an1x1+an2x2+⋯+a1mxm=y1⋯+a2mxm=y2⋮⋯+anmxm=yn のような連立一次方程式は、
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+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]
])
array([[ 2, -1],
[ 0, 0]])
array([[ 2, -1],
[ 0, 0]])
べき乗¶
AAAAA=A2=A3 An+m(An)m=An+Am=Anm 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(A+B)(A−B)(AB)2=A2+AB+BA+B2=A2−AB+BA−B2=ABAB 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)について、xxTxは(xxT)xと捉えるよりx(xTx)としたほうが楽
(xxT)x=⎝⎛x12x2x1⋮xnx1x1x2x22⋮xnx2⋯⋯⋯x1xnx2xn⋮xn2⎠⎞⎝⎛x1x2⋮xn⎠⎞=⎝⎛x12⋅x1+x1x2⋅x2+⋯+x1xn⋅xnx2x1⋅x1+x22⋅x2+⋯+x2xn⋅xn⋮xnx1⋅x1+xnx2⋅x2+⋯+xn2⋅xn⎠⎞=⎝⎛x1x2⋮xn⎠⎞i=1∑nxi2 x(xTx)=⎝⎛x1x2⋮xn⎠⎞i=1∑nxi2 対称行列¶
を満たす正方行列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()
ブロック行列¶
行列をいくつかのブロック(小行列)に分けて扱うことがある
A=⎝⎛15…926…1037…11⋮⋮…⋮48…12⎠⎞=(A11A21A12A22) 特に行ベクトルや列ベクトルに分けると扱いやすい
AB=⎝⎛a1a2⋮am⎠⎞(b1′⋯bl′)=⎝⎛a1b1′a2b1′⋮amb1′a1b2′a2b2′⋮amb2′⋯⋯⋯a1bι′a2bl′⋮ambl′⎠⎞ AB=⎝⎛a1a2⋮am⎠⎞B=⎝⎛a1Ba2B⋮amB⎠⎞ AB=A(b1′b2′⋯bl′)=(Ab1′Ab2′⋯Abl′) AB=(a1′a2′⋯an′)⎝⎛b1b2⋮bn⎠⎞=(a1′b1+a2′b2+⋯+an′bn) ブロック行列の積¶
一般に、積が定義可能な行列A,Bに対して
A=(A11A21A12A22),B=(B11B21B12B22) と分割するとする。ここでA11∈Rs×r,A12∈Rs×n−r,A21∈Rm−s×r,A22∈Rm−s×n−rで、
B11∈Rr×t,B12∈Rr×l−t,B21∈Rn−r×t,B22∈Rn−r×l−tである。
このとき、
AB=(A11A21A12A22)(B11B21B12B22)=(A11B11+A12B21A21B11+A22B21A11B12+A12B22A21B12+A22B22) が成立する。
対角以外のブロック(A12,A21,B12,B21)が零行列である場合
(A11OOA22)(B11OOB22)=(A11B11OOA22B22) となる
対角以外の部分に零でないブロック∗があっても、次のようになる
(A11∗OA22)(B11∗OB22)(A11O∗A22)(B11O∗B22)=(A11B11∗′OA22B22)=(A11B11O∗′A22B22) ここで左辺の∗はブロックのサイズが合えばなんでもよいことを意味し、右辺の∗′はそのサイズのある定まった行列を表す(左辺と右辺で∗の部分が等しいわけではない)
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=(IOAI) という行列があるとき、
M2=(IOA′I) この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]])
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]])
基本変形¶
行基本変形¶
2つの行を入れ替える
ある行をc倍する(c=0)
ある行をc倍して他の行に加える
列基本変形¶
2つの列を入れ替える
ある列をc倍する(c=0)
ある列をc倍して他の列に加える