プログラマのための線形代数再入門2 〜 要件定義から学ぶ行列式と逆行列
TRANSCRIPT
行列式 (determinant)
A =
0
@1 2 34 5 67 8 9
1
A
detA =
������
1 2 34 5 67 8 9
������= 1 · 5 · 9 + 2 · 6 · 7 + 3 · 4 · 8
�3 · 5 · 7� 2 · 4 · 9� 1 · 6 · 8
行列式 (determinant)
A =
0
@1 2 34 5 67 8 9
1
A
detA =
������
1 2 34 5 67 8 9
������= 1 · 5 · 9 + 2 · 6 · 7 + 3 · 4 · 8
�3 · 5 · 7� 2 · 4 · 9� 1 · 6 · 8
行列式 (determinant)
A =
0
@1 2 34 5 67 8 9
1
A
detA =
������
1 2 34 5 67 8 9
������= 1 · 5 · 9 + 2 · 6 · 7 + 3 · 4 · 8
�3 · 5 · 7� 2 · 4 · 9� 1 · 6 · 8
行列式 (determinant)
A =
0
@1 2 34 5 67 8 9
1
A
detA =
������
1 2 34 5 67 8 9
������= 1 · 5 · 9 + 2 · 6 · 7 + 3 · 4 · 8
�3 · 5 · 7� 2 · 4 · 9� 1 · 6 · 8
行列式 (determinant)
A =
0
@1 2 34 5 67 8 9
1
A
detA =
������
1 2 34 5 67 8 9
������= 1 · 5 · 9 + 2 · 6 · 7 + 3 · 4 · 8
�3 · 5 · 7� 2 · 4 · 9� 1 · 6 · 8
行列式 (determinant)
A =
0
@1 2 34 5 67 8 9
1
A
detA =
������
1 2 34 5 67 8 9
������= 1 · 5 · 9 + 2 · 6 · 7 + 3 · 4 · 8
�3 · 5 · 7� 2 · 4 · 9� 1 · 6 · 8
行列式 (determinant)
A =
0
@1 2 34 5 67 8 9
1
A
detA =
������
1 2 34 5 67 8 9
������= 1 · 5 · 9 + 2 · 6 · 7 + 3 · 4 · 8
�3 · 5 · 7� 2 · 4 · 9� 1 · 6 · 8
行列式 (determinant)
A =
0
@1 2 34 5 67 8 9
1
A
detA =
������
1 2 34 5 67 8 9
������= 1 · 5 · 9 + 2 · 6 · 7 + 3 · 4 · 8
�3 · 5 · 7� 2 · 4 · 9� 1 · 6 · 8
= 0
行列式 (determinant)
= 1 · 6 · 11 · 16� 1 · 6 · 12 · 15 + 1 · 7 · 12 · 14� 1 · 7 · 10 · 16 + 1 · 8 · 11 · 14� 1 · 8 · 10 · 15+2 · 5 · 12 · 15� 2 · 5 · 11 · 16 + 2 · 7 · 9 · 16� 2 · 7 · 12 · 13 + 2 · 8 · 11 · 13� 2 · 8 · 9 · 15+3 · 5 · 10 · 16� 3 · 5 · 12 · 14 + 3 · 6 · 12 · 13� 3 · 6 · 9 · 16 + 3 · 8 · 9 · 14� 3 · 8 · 10 · 13+4 · 5 · 10 · 15� 4 · 5 · 11 · 14 + 4 · 6 · 9 · 15� 4 · 6 · 11 · 13 + 4 · 7 · 10 · 13� 4 · 7 · 9 · 13
��������
1 2 3 45 6 7 89 10 11 1213 14 15 16
��������
!?
プログラマの「理解」の3層構造
• 要件が分かる:何のためのものなのか
• 仕様が分かる:何を与えると何が返ってくるのか
• 実装が分かる:どのように動いているのか
プログラマはこの3つが揃ってはじめて「分かった」と言える。
(復習) 行列は線形変換の定量表現
✓x
y
◆
x
✓10
◆
y
✓01
◆
f
y
✓bx
by
◆
x
✓a
x
a
y
◆
f
✓x
y
◆=
✓a
x
b
x
a
y
b
y
◆✓x
y
◆
✓10
◆
✓01
◆
✓a0
◆
✓0b
◆
✓cos ✓sin ✓
◆
✓� sin ✓cos ✓
◆
✓01
◆
✓�10
◆ ✓10
◆
f
変換の特徴を表す 1次元の量 を考えたい
特に潰れるかどうかを 判別したい
行列式の「要件」• n次元の線形変換は n次正方行列 (n2 個の数) で表される。
• 線形変換の特徴を 1次元の量 によって表したい。
• 特に「潰れてしまう」かどうかを判別したい。
n次正方行列 A detAの行列式A (1次元の量)
✓10
◆
✓01
◆
✓a0
◆
✓0b
◆
✓cos ✓sin ✓
◆
✓� sin ✓cos ✓
◆
✓01
◆
✓�10
◆ ✓10
◆
f
detA = abdetA = 1
detA = -1
detA = 0
detA = 「面積の倍率 × 向き」
✓x
y
◆
x
✓10
◆
y
✓01
◆
f
y
✓bx
by
◆
x
✓a
x
a
y
◆
f
✓x
y
◆=
✓a
x
b
x
a
y
b
y
◆✓x
y
◆
3次元(さらに高次元)の場合、 det A = 体積の倍率 × 向き
f
0
@ax
ay
az
1
A
0
@bx
by
bz
1
A
0
@cx
cy
cz
1
A
右手系 → 左手系 の場合 detA < 0
2) det(b, a) = -det(a, b)
✓10
◆
✓01
◆
✓10
◆
✓01
◆
A =
✓0 11 0
◆
裏向きf
det(b,a) = �det(a, b)
����0 11 0
���� = �����1 00 1
���� = �1
det(a1 + a2, b) = det(a1, b) + det(a2, b), det(k・a, b) = k・det(a, b)
✓10
◆
✓01
◆
f
3)det(ka, b) = k · det(a, b)
A =
✓2 00 1
◆
✓01
◆
✓20
◆
����2 00 1
���� = 2 ·����1 00 1
���� = 2
det(a1 + a2, b) = det(a1, b) + det(a2, b)
実はこれが行列式の全て!
detE = 1
det(b,a) = �det(a, b)
det(ka, b) = k · det(a, b)
1)
2)
3)
(交代性)
(多重線形性)det(a1 + a2, b) = det(a1, b) + det(a2, b)
����1 23 4
���� =
����1 20 4
����+����0 23 4
����
=
����1 20 0
����+����1 00 4
����+����0 23 0
����+����0 03 4
����
3)
����1 23 4
���� =
����1 20 4
����+����0 23 4
����
= 0 = 0
=
����1 20 0
����+����1 00 4
����+����0 23 0
����+����0 03 4
����4)
����1 23 4
���� =
����1 20 4
����+����0 23 4
����
=
����1 20 0
����+����1 00 4
����+����0 23 0
����+����0 03 4
����
= 4
����1 00 1
����+ 2 · 3����0 11 0
����3)
����1 23 4
���� =
����1 20 4
����+����0 23 4
����
=
����1 20 0
����+����1 00 4
����+����0 23 0
����+����0 03 4
����
= 4
����1 00 1
����+ 2 · 3����0 11 0
����
= 4
����1 00 1
����� 2 · 3����1 00 1
����
2)
����1 23 4
���� =
����1 20 4
����+����0 23 4
����
=
����1 20 0
����+����1 00 4
����+����0 23 0
����+����0 03 4
����
= 4
����1 00 1
����+ 2 · 3����0 11 0
����
= 4
����1 00 1
����� 2 · 3����1 00 1
����
= 1 = 11)
����1 23 4
���� =
����1 20 4
����+����0 23 4
����
=
����1 20 0
����+����1 00 4
����+����0 23 0
����+����0 03 4
����
= 4
����1 00 1
����+ 2 · 3����0 11 0
����
= 4
����1 00 1
����� 2 · 3����1 00 1
���� = �2
������
1 2 34 5 67 8 9
������= 1 · 5 · 9
������
1 0 00 1 00 0 1
������+ 1 · 6 · 8
������
1 0 00 0 10 1 0
������
+2 · 4 · 9
������
0 1 01 0 00 0 1
������+ 2 · 6 · 7
������
0 1 00 0 11 0 0
������
+3 · 4 · 8
������
0 0 11 0 00 1 0
������+ 3 · 5 · 7
������
0 0 10 1 01 0 0
������
������
1 2 34 5 67 8 9
������= 1 · 5 · 9
������
1 0 00 1 00 0 1
������+ 1 · 6 · 8
������
1 0 00 0 10 1 0
������
+2 · 4 · 9
������
0 1 01 0 00 0 1
������+ 2 · 6 · 7
������
0 1 00 0 11 0 0
������
+3 · 4 · 8
������
0 0 11 0 00 1 0
������+ 3 · 5 · 7
������
0 0 10 1 01 0 0
������
= 1
= 1
= 1
= �1
= �1
= �1
������
1 2 34 5 67 8 9
������= 1 · 5 · 9
������
1 0 00 1 00 0 1
������+ 1 · 6 · 8
������
1 0 00 0 10 1 0
������
+2 · 4 · 9
������
0 1 01 0 00 0 1
������+ 2 · 6 · 7
������
0 1 00 0 11 0 0
������
+3 · 4 · 8
������
0 0 11 0 00 1 0
������+ 3 · 5 · 7
������
0 0 10 1 01 0 0
������
= 1 · 5 · 9� 1 · 6 · 8+2 · 6 · 7� 2 · 4 · 9+3 · 4 · 8� 3 · 5 · 7 = 0
行列式計算のアルゴリズム
1. 各行から列が重複しないように成分を取り出して掛ける
2. 残った 0, 1 だけの行列式を計算する(偶数回の交代で単
位行列になる場合 1、奇数回の場合 -1)
3. これらの取り出し方の全パターンを足し合わせる
detA =X
�2Sn
Y
i
ai,�(i)
������
. . .
. . .
. . .
������
=X
�2Sn
Y
i
ai,�(i)sgn(�)
アルゴリズムを数式にすると…
並べ替えの「符号」 (偶数回: 1, 奇数回: -1)
������
1 2 34 5 67 8 9
������= 1 · 5 · 9
������
1 0 00 1 00 0 1
������+ 1 · 6 · 8
������
1 0 00 0 10 1 0
������
+2 · 4 · 9
������
0 1 01 0 00 0 1
������+ 2 · 6 · 7
������
0 1 00 0 11 0 0
������
+3 · 4 · 8
������
0 0 11 0 00 1 0
������+ 3 · 5 · 7
������
0 0 10 1 01 0 0
������
detA =X
�2Sn
Y
i
ai,�(i)sgn(�)
同じ式に見えるかな?
理解すべき原理はこっち:
detE = 1
det(b,a) = �det(a, b)
det(ka, b) = k · det(a, b)
1)
2)
3)
(交代性)
(多重線形性)det(a1 + a2, b) = det(a1, b) + det(a2, b)
������
1 2 34 5 67 8 9
������= 1 · 5 · 9
������
1 0 00 1 00 0 1
������+ 1 · 6 · 8
������
1 0 00 0 10 1 0
������
+2 · 4 · 9
������
0 1 01 0 00 0 1
������+ 2 · 6 · 7
������
0 1 00 0 11 0 0
������
+3 · 4 · 8
������
0 0 11 0 00 1 0
������+ 3 · 5 · 7
������
0 0 10 1 01 0 0
������
������
1 2 34 5 67 8 9
������= 1 · 5 · 9
������
1 0 00 1 00 0 1
������+ 1 · 6 · 8
������
1 0 00 0 10 1 0
������
+2 · 4 · 9
������
0 1 01 0 00 0 1
������+ 2 · 6 · 7
������
0 1 00 0 11 0 0
������
+3 · 4 · 8
������
0 0 11 0 00 1 0
������+ 3 · 5 · 7
������
0 0 10 1 01 0 0
������
������
1 2 34 5 67 8 9
������= 1
0
@5 · 9
������
1 0 00 1 00 0 1
������+ 6 · 8
������
1 0 00 0 10 1 0
������
1
A
+2
0
@4 · 9
������
0 1 01 0 00 0 1
������+ 6 · 7
������
0 1 00 0 11 0 0
������
1
A
+3
0
@4 · 8
������
0 0 11 0 00 1 0
������+ 5 · 7
������
0 0 10 1 01 0 0
������
1
A
������
1 2 34 5 67 8 9
������= 1
0
@5 · 9
������
1 0 00 1 00 0 1
������+ 6 · 8
������
1 0 00 0 10 1 0
������
1
A
+2
0
@4 · 9
������
0 1 01 0 00 0 1
������+ 6 · 7
������
0 1 00 0 11 0 0
������
1
A
+3
0
@4 · 8
������
0 0 11 0 00 1 0
������+ 5 · 7
������
0 0 10 1 01 0 0
������
1
A
������
1 2 34 5 67 8 9
������= 1
✓5 · 9
����1 00 1
����+ 6 · 8����0 11 0
����
◆
�2
✓4 · 9
����1 00 1
����+ 6 · 7����0 11 0
����
◆
+3
✓4 · 8
����1 00 1
����+ 5 · 7����0 11 0
����
◆
������
1 2 34 5 67 8 9
������= 1
✓5 · 9
����1 00 1
����+ 6 · 8����0 11 0
����
◆
�2
✓4 · 9
����1 00 1
����+ 6 · 7����0 11 0
����
◆
+3
✓4 · 8
����1 00 1
����+ 5 · 7����0 11 0
����
◆
������
1 2 34 5 67 8 9
������= 1
✓5 · 9
����1 00 1
����+ 6 · 8����0 11 0
����
◆
�2
✓4 · 9
����1 00 1
����+ 6 · 7����0 11 0
����
◆
+3
✓4 · 8
����1 00 1
����+ 5 · 7����0 11 0
����
◆
= 1
����5 68 9
����� 2
����4 67 9
����+ 3
����4 57 8
����
������
1 2 34 5 67 8 9
������= 1
✓5 · 9
����1 00 1
����+ 6 · 8����0 11 0
����
◆
�2
✓4 · 9
����1 00 1
����+ 6 · 7����0 11 0
����
◆
+3
✓4 · 8
����1 00 1
����+ 5 · 7����0 11 0
����
◆
= 1
����5 68 9
����� 2
����4 67 9
����+ 3
����4 57 8
���� … 第1行で展開
������
1 2 34 5 67 8 9
������= 1 · 5 · 9
������
1 0 00 1 00 0 1
������+ 1 · 6 · 8
������
1 0 00 0 10 1 0
������
+2 · 4 · 9
������
0 1 01 0 00 0 1
������+ 2 · 6 · 7
������
0 1 00 0 11 0 0
������
+3 · 4 · 8
������
0 0 11 0 00 1 0
������+ 3 · 5 · 7
������
0 0 10 1 01 0 0
������
くくり出し方を変えれば、任意の行・列で展開できる
= �2
����4 67 9
����+ 5
����1 37 9
����� 8
����1 34 6
����
✓10
◆
✓01
◆
✓a0
◆
✓0b
◆
✓cos ✓sin ✓
◆
✓� sin ✓cos ✓
◆
✓01
◆
✓�10
◆ ✓10
◆
f
逆行列:逆変換に対応する行列
f�1
A�1=
✓cos(�✓) � sin(�✓)sin(�✓) cos(�✓)
◆A�1 =
✓1/a 00 1/b
◆
A�1 =
✓�1 00 1
◆
× 逆変換なし!
A =
0
@1 2 31 0 �12 1 �2
1
A
0
@x
y
z
1
A
0
@x+ 2y + z
x� z
2x+ y � 2z
1
A
A�1
det A ≠ 0 であれば、逆行列 A-1 は取れるはず。
A�1A = E AA�1 = E
������
1 2 31 0 �12 1 �2
������= 1
����0 �11 �2
����� 2
����1 �12 �2
����+ 3
����1 02 1
���� = 4第1行で展開
������
1 2 31 0 �12 1 �2
������= 1
����0 �11 �2
����� 2
����1 �12 �2
����+ 3
����1 02 1
���� = 4
������
1 0 �11 0 �12 1 �2
������= 1
����0 �11 �2
����� 0
����1 �12 �2
����� 1
����1 02 1
����2行目を1行目にコピペ
������
1 2 31 0 �12 1 �2
������= 1
����0 �11 �2
����� 2
����1 �12 �2
����+ 3
����1 02 1
���� = 4
������
1 0 �11 0 �12 1 �2
������= 1
����0 �11 �2
����� 0
����1 �12 �2
����� 1
����1 02 1
���� = 0
������
1 2 31 0 �12 1 �2
������= 1
����0 �11 �2
����� 2
����1 �12 �2
����+ 3
����1 02 1
���� = 4
������
1 0 �11 0 �12 1 �2
������= 1
����0 �11 �2
����� 0
����1 �12 �2
����� 1
����1 02 1
���� = 0同じ行が並んでいるので 計算するまでもなく 0
������
1 2 31 0 �12 1 �2
������= 1
����0 �11 �2
����� 2
����1 �12 �2
����+ 3
����1 02 1
���� = 4
������
1 0 �11 0 �12 1 �2
������= 1
����0 �11 �2
����� 0
����1 �12 �2
����� 1
����1 02 1
����
������
2 1 �21 0 �12 1 �2
������= 2
����0 �11 �2
����� 1
����1 �12 �2
����� 2
����1 02 1
����
= 0
= 03行目を1行目にコピペ
������
1 2 31 0 �12 1 �2
������= 1
����0 �11 �2
����� 2
����1 �12 �2
����+ 3
����1 02 1
���� = 4
������
1 0 �11 0 �12 1 �2
������= 1
����0 �11 �2
����� 0
����1 �12 �2
����� 1
����1 02 1
����
������
2 1 �21 0 �12 1 �2
������= 2
����0 �11 �2
����� 1
����1 �12 �2
����� 2
����1 02 1
����
= 0
= 0
������
1 2 31 0 �12 1 �2
������= 1
����0 �11 �2
����� 2
����1 �12 �2
����+ 3
����1 02 1
���� = 4
������
1 0 �11 0 �12 1 �2
������= 1
����0 �11 �2
����� 0
����1 �12 �2
����� 1
����1 02 1
����
������
2 1 �21 0 �12 1 �2
������= 2
����0 �11 �2
����� 1
����1 �12 �2
����� 2
����1 02 1
����
= 0
= 0
Aの要素が並んでいる…
������
1 2 31 0 �12 1 �2
������= 1
����0 �11 �2
����� 2
����1 �12 �2
����+ 3
����1 02 1
���� = 4
������
1 0 �11 0 �12 1 �2
������= 1
����0 �11 �2
����� 0
����1 �12 �2
����� 1
����1 02 1
����
������
2 1 �21 0 �12 1 �2
������= 2
����0 �11 �2
����� 1
����1 �12 �2
����� 2
����1 02 1
����
= 0
= 0
縦には同じ行列式…これは…!
ドーン!
0
@1 2 31 0 �12 1 �2
1
A
0
BBBBBBBBBB@
����0 �11 �2
����
�����1 �12 �2
����
����1 02 1
����
1
CCCCCCCCCCA
=
0
@400
1
A
ドドーン!
0
@1 2 31 0 �12 1 �2
1
A
0
BBBBBBBBBB@
�����2 31 �2
����
����1 32 �2
����
�����1 22 1
����
1
CCCCCCCCCCA
=
0
@040
1
A
0
@1 2 31 0 �12 1 �2
1
A
0
BBBBBBBBBB@
����2 30 �1
����
�����1 31 �1
����
����1 21 0
����
1
CCCCCCCCCCA
=
0
@004
1
A
全部合わせて…
0
@1 2 31 0 �12 1 �2
1
A
0
BBBBBBBBBB@
����0 �11 �2
����
�����1 �12 �2
����
����1 02 1
����
1
CCCCCCCCCCA
=
0
@400
1
A
0
@1 2 31 0 �12 1 �2
1
A
0
BBBBBBBBBB@
�����2 31 �2
����
����1 32 �2
����
�����1 22 1
����
1
CCCCCCCCCCA
=
0
@040
1
A
0
@1 2 31 0 �12 1 �2
1
A
0
BBBBBBBBBB@
����2 30 �1
����
�����1 31 �1
����
����1 21 0
����
1
CCCCCCCCCCA
=
0
@004
1
A
Enter the Matrix…
0
@1 2 31 0 �12 1 �2
1
A
0
BBBBBBBBBB@
����0 �11 �2
���� �����2 30 �1
����
����2 30 �1
����
�����1 �12 �2
����
����1 32 �2
���� �����1 31 �1
����
����1 02 1
���� �����1 22 1
����
����1 21 0
����
1
CCCCCCCCCCA
=
0
@4 0 00 4 00 0 4
1
A
両辺 detA = 4 で割れば…
0
@1 2 31 0 �12 1 �2
1
A
0
BBBBBBBBBB@
����0 �11 �2
���� �����2 30 �1
����
����2 30 �1
����
�����1 �12 �2
����
����1 32 �2
���� �����1 31 �1
����
����1 02 1
���� �����1 22 1
����
����1 21 0
����
1
CCCCCCCCCCA
=
0
@4 0 00 4 00 0 4
1
A
detA = 4
できあがり!
0
@1 2 31 0 �12 1 �2
1
A · 1
detA
0
BBBBBBBBBB@
����0 �11 �2
���� �����2 30 �1
����
����2 30 �1
����
�����1 �12 �2
����
����1 32 �2
���� �����1 31 �1
����
����1 02 1
���� �����1 22 1
����
����1 21 0
����
1
CCCCCCCCCCA
=
0
@1 0 00 1 00 0 1
1
A
= A�1=
1
4
0
@1 7 �10 �8 41 3 �2
1
A
行列式の原理:
detE = 1
det(b,a) = �det(a, b)
det(ka, b) = k · det(a, b)
1)
2)
3)
(交代性)
(多重線形性)det(a1 + a2, b) = det(a1, b) + det(a2, b)
Thanks!
Twitter: @taketo1024Blog: http://taketo1024.hateblo.jp
0
@1 2 31 0 �12 1 �2
1
A · 1
detA
0
BBBBBBBBBB@
����0 �11 �2
���� �����2 30 �1
����
����2 30 �1
����
�����1 �12 �2
����
����1 32 �2
���� �����1 31 �1
����
����1 02 1
���� �����1 22 1
����
����1 21 0
����
1
CCCCCCCCCCA
=
0
@1 0 00 1 00 0 1
1
A