プログラマのための線形代数再入門
TRANSCRIPT
プログラマのための線形代数 “再” 入門 ~行列・線形変換・アフィン変換~
@taketo1024
2015/01/30 第1回プログラマのための数学勉強会
今日の内容
1. 行列の積
2. 線形変換とアフィン変換
1. 行列の積
行列の足し算
✓3 54 10
◆+
✓3 45 8
◆=
✓3 + 3 5 + 44 + 5 10 + 8
◆
=
✓6 99 18
◆
行列の掛け算
✓3 54 10
◆✓3 45 8
◆=
✓3 · 3 5 · 44 · 5 10 · 8
◆
=
✓9 2020 80
◆
行列の掛け算
✓3 54 10
◆✓3 45 8
◆=
✓3 · 3 5 · 44 · 5 10 · 8
◆
=
✓9 2020 80
◆×
こうだったら簡単だったのに…
行列の掛け算
✓3 54 10
◆✓3 45 8
◆=
✓3 · 3 + 5 · 5 3 · 4 + 5 · 84 · 3 + 10 · 5 4 · 4 + 10 · 8
◆
=
✓34 5262 96
◆
これが正しい計算規則です。
行列の掛け算
✓3 54 10
◆✓3 45 8
◆=
✓3 · 3 + 5 · 5 3 · 4 + 5 · 84 · 3 + 10 · 5 4 · 4 + 10 · 8
◆
=
✓34 5262 96
◆
行列の掛け算
✓3 54 10
◆✓3 45 8
◆=
✓3 · 3 + 5 · 5 3 · 4 + 5 · 84 · 3 + 10 · 5 4 · 4 + 10 · 8
◆
=
✓34 5262 96
◆
行列の掛け算
✓3 54 10
◆✓3 45 8
◆=
✓3 · 3 + 5 · 5 3 · 4 + 5 · 84 · 3 + 10 · 5 4 · 4 + 10 · 8
◆
=
✓34 5262 96
◆
行列の掛け算
✓3 54 10
◆✓3 45 8
◆=
✓3 · 3 + 5 · 5 3 · 4 + 5 · 84 · 3 + 10 · 5 4 · 4 + 10 · 8
◆
=
✓34 5262 96
◆
行列の掛け算
✓3 54 10
◆✓3 45 8
◆=
✓3 · 3 + 5 · 5 3 · 4 + 5 · 84 · 3 + 10 · 5 4 · 4 + 10 · 8
◆
=
✓34 5262 96
◆
行列の掛け算
✓3 54 10
◆✓3 45 8
◆=
✓3 · 3 + 5 · 5 3 · 4 + 5 · 84 · 3 + 10 · 5 4 · 4 + 10 · 8
◆
=
✓34 5262 96
◆
行列の掛け算
✓3 54 10
◆✓3 45 8
◆=
✓3 · 3 + 5 · 5 3 · 4 + 5 · 84 · 3 + 10 · 5 4 · 4 + 10 · 8
◆
=
✓34 5262 96
◆
行列の掛け算
✓3 54 10
◆✓3 45 8
◆=
✓3 · 3 + 5 · 5 3 · 4 + 5 · 84 · 3 + 10 · 5 4 · 4 + 10 · 8
◆
=
✓34 5262 96
◆
行列の掛け算
✓3 54 10
◆✓3 45 8
◆=
✓3 · 3 + 5 · 5 3 · 4 + 5 · 84 · 3 + 10 · 5 4 · 4 + 10 · 8
◆
=
✓34 5262 96
◆
行列の掛け算
✓3 54 10
◆✓3 45 8
◆=
✓3 · 3 + 5 · 5 3 · 4 + 5 · 84 · 3 + 10 · 5 4 · 4 + 10 · 8
◆
=
✓34 5262 96
◆
行列の掛け算
✓3 54 10
◆✓3 45 8
◆=
✓3 · 3 + 5 · 5 3 · 4 + 5 · 84 · 3 + 10 · 5 4 · 4 + 10 · 8
◆
=
✓34 5262 96
◆
行列の掛け算
✓3 54 10
◆✓3 45 8
◆=
✓3 · 3 + 5 · 5 3 · 4 + 5 · 84 · 3 + 10 · 5 4 · 4 + 10 · 8
◆
=
✓34 5262 96
◆
ふぅ…
正直、3×3以上の行列計算は地獄です。
(僕は必ず計算を間違うので気が狂いそうになる)
なぜこう定義する?
もんだい• さの工場では車とトラックを製造しています。
• 車の製造には作業員3人、ロボット5台の稼働が必要です。
• トラックの製造には作業員4人、ロボット8台の稼働が必要です。
• さの工場で車を2台、トラックを3台製造するのに必要な作業員とロボットの稼働はいくらでしょう?
こたえ
車2台 : 2 ×(作業員:3人 + ロボット:5台)
トラック3台 : 3 ×(作業員:4人 + ロボット:8台)+)
作業員 ロボット
車 3人/台 5人/台
トラック 4台/台 8台/台
こたえ
車2台 : 2 ×(作業員:3人 + ロボット:5台)
トラック3台 : 3 ×(作業員:4人 + ロボット:8台)+)
作業員:(2 × 3 + 3 × 4) = 18人、作業員 ロボット
車 3人/台 5人/台
トラック 4台/台 8台/台
こたえ
車2台 : 2 ×(作業員:3人 + ロボット:5台)
トラック3台 : 3 ×(作業員:4人 + ロボット:8台)+)
作業員:(2 × 3 + 3 × 4) = 18人ロボット:(2 × 5 + 3 × 8) = 34台作業員 ロボット
車 3人/台 5人/台
トラック 4台/台 8台/台
こたえ
車2台 : 2 ×(作業員:3人 + ロボット:5台)
トラック3台 : 3 ×(作業員:4人 + ロボット:8台)+)
作業員:(2 × 3 + 3 × 4) = 18人ロボット:(2 × 5 + 3 × 8) = 34台 こたえ
作業員 ロボット
車 3人/台 5人/台
トラック 4台/台 8台/台
行列の積で書き直すと…
(ベクトルは縦に書かないの?は後で説明します)
車・トラック
作業員・ロボット
�2 3
�✓ 3 54 8
◆=
�2 · 3 + 3 · 4 2 · 5 + 3 · 8
�
=�18 34
�
作業員 ロボット
車 3人/台 5人/台
トラック 4台/台 8台/台
もんだい 2• 作業員はサンドイッチを2個食べ、コーヒーを3杯飲みます。
• ロボットはサンドイッチ6個、コーヒー10杯を燃料として動きます。
• さの工場で車を2台、トラックを3台製造するのに必要なサンドイッチとコーヒーはいくらでしょう?
こたえSW COFFEE
作業員 2個/人 3杯/人
ロボット 6個/台 10杯/台
作業員 ロボット
車 3人/台 5人/台
トラック 4台/台 8台/台
✓3 54 8
◆ ✓2 36 10
◆
こたえ
�2 3
�✓ 3 54 8
◆=
�18 34
�
SW COFFEE
作業員 2個/人 3杯/人
ロボット 6個/台 10杯/台
作業員 ロボット
車 3人/台 5人/台
トラック 4台/台 8台/台 車・トラック 作業員・ロボット
こたえ
�2 3
�✓ 3 54 8
◆=
�18 34
�
�18 34
�✓ 2 36 10
◆=
�240 394
�
SW COFFEE
作業員 2個/人 3杯/人
ロボット 6個/台 10杯/台
作業員 ロボット
車 3人/台 5人/台
トラック 4台/台 8台/台 車・トラック 作業員・ロボット
作業員・ロボット
こたえ
�2 3
�✓ 3 54 8
◆=
�18 34
�
�18 34
�✓ 2 36 10
◆=
�240 394
�
SW COFFEE
作業員 2個/人 3杯/人
ロボット 6個/台 10杯/台
作業員 ロボット
車 3人/台 5人/台
トラック 4台/台 8台/台
こたえ
車・トラック 作業員・ロボット
サンドイッチ・コーヒー作業員・ロボット
まとめて書けば:
�2 3
�✓ 3 54 8
◆✓2 36 10
◆=
�18 34
�✓ 2 36 10
◆
=�240 394
�
まとめて書けば:
�2 3
�✓ 3 54 8
◆✓2 36 10
◆=
�18 34
�✓ 2 36 10
◆
=�240 394
�先にこっちを計算すると…
まとめて書けば:
�2 3
�✓ 3 54 8
◆✓2 36 10
◆=
�18 34
�✓ 2 36 10
◆
=�240 394
�
✓3 54 8
◆✓2 36 10
◆=
✓3 · 2 + 5 · 6 3 · 3 + 5 · 104 · 2 + 8 · 6 4 · 3 + 8 · 10
◆
=
✓36 5956 92
◆
まとめて書けば:
�2 3
�✓ 3 54 8
◆✓2 36 10
◆=
�18 34
�✓ 2 36 10
◆
=�240 394
�
✓3 54 8
◆✓2 36 10
◆=
✓3 · 2 + 5 · 6 3 · 3 + 5 · 104 · 2 + 8 · 6 4 · 3 + 8 · 10
◆
=
✓36 5956 92
◆
まとめて書けば:
�2 3
�✓ 3 54 8
◆✓2 36 10
◆=
�18 34
�✓ 2 36 10
◆
=�240 394
�
�2 3
�✓ 36 5956 92
◆=
�2 · 36 + 3 · 56 2 · 59 + 3 · 92
�
=�240 394
�
まとめて書けば:
�2 3
�✓ 3 54 8
◆✓2 36 10
◆=
�18 34
�✓ 2 36 10
◆
=�240 394
�
�2 3
�✓ 36 5956 92
◆=
�2 · 36 + 3 · 56 2 · 59 + 3 · 92
�
=�240 394
�
まとめて書けば:
�2 3
�✓ 3 54 8
◆✓2 36 10
◆=
�18 34
�✓ 2 36 10
◆
=�240 394
�
�2 3
�✓ 36 5956 92
◆=
�2 · 36 + 3 · 56 2 · 59 + 3 · 92
�
=�240 394
�同じ!
�18 34
�
つまりこういうこと✓
3 54 8
◆ ✓2 36 10
◆
車・トラック 作業員・ロボット サンドイッチ・コーヒー
�52 95
� �240 394
�
�18 34
�
つまりこういうこと✓
3 54 8
◆ ✓2 36 10
◆
車・トラック 作業員・ロボット サンドイッチ・コーヒー
�52 95
�
✓36 5956 92
◆
一発でいける!
�240 394
�
SW COFFEE
作業員 2個/人 3杯/人
ロボット 6個/台 10杯/台
作業員 ロボット
車 3人/台 5人/台
トラック 4台/台 8台/台× =
SW COFFEE
車 36個/台 59杯/台
トラック 56個/台 92杯/台
✓3 54 8
◆✓2 36 10
◆=
✓36 5956 92
◆
行列の掛け算は、対応表の合成になっていた!打ち消しあう
もんだい 3
• では車を52台、トラックを95台製造するのに必要なサンドイッチとコーヒーは?
こたえ
�18 34
� �240 394
�
✓3 54 8
◆ ✓2 36 10
◆
車・トラック 作業員・ロボット サンドイッチ・コーヒー
�52 95
�… …
�18 34
�
こたえ✓
3 54 8
◆ ✓2 36 10
◆
車・トラック 作業員・ロボット サンドイッチ・コーヒー
�52 95
�…
✓36 5956 92
◆一発でいきましょう
�240 394
�…
�18 34
�
こたえ✓
3 54 8
◆ ✓2 36 10
◆
車・トラック 作業員・ロボット サンドイッチ・コーヒー
�52 95
�…
✓36 5956 92
◆
�7192 11808
�
こたえ
行列の積は変換の合成と対応する形で 定義されていた!
�x y
� �x y
�A
�x y
�AB
A B
AB
あらかじめ積を計算しておけば、中間をすっ飛ばせる!
ちなみに数学ではベクトルを縦に書き、行列を左から掛けることが多い
A B
✓x
y
◆A
✓x
y
◆BA
✓x
y
◆
BA 順序に注意!
と書く場合はこっちの方が分かりやすいf(~x) = A~x
「転置」を取れば同じ計算になる
�2 3
�✓ 3 54 8
◆✓2 36 10
◆=
�240 394
�
✓2 63 10
◆✓3 45 8
◆✓23
◆=
✓240394
◆
左から作用
右から作用
… DirectX 系
… OpenGL 系
以後、変換について話すので後者のスタイルで書きます。
(DirectX 系の人は脳内転置お願いします)
2. 線形変換とアフィン変換
線形変換
ベクトルの線形性(平行と比率)の保たれる変換
f
線形変換
… 和をバラせる
… 実数倍をバラせる
(f(~x+ ~y) = f(~x) + f(~y)
f(a · ~x) = a · f(~x)
✓10
◆,
✓01
◆の行き先だけで決まる!線形変換は
f
✓10
◆=
✓ax
ay
◆, f
✓01
◆=
✓bx
by
◆
とすれば、
f
✓x
y
◆= f(x ·
✓10
◆+ y ·
✓01
◆)
= x · f✓
10
◆+ y · f
✓01
◆
= x ·✓
a
x
a
y
◆+ y ·
✓b
x
b
y
◆
✓x
y
◆
x
✓10
◆
y
✓01
◆
f
✓x
y
◆= x
✓a
x
a
y
◆+ y
✓b
x
b
y
◆
x
✓a
x
a
y
◆
y
✓bx
by
◆
f
その結果は行列とベクトルの積で書ける!
x
✓a
x
a
y
◆
y
✓bx
by
◆
f
✓x
y
◆= x
✓a
x
a
y
◆+ y
✓b
x
b
y
◆=
✓a
x
b
x
a
y
b
y
◆✓x
y
◆
f
✓x
y
◆=
✓a
x
b
x
a
y
b
y
◆✓x
y
◆
つまり線形変換は の行き先を並べた行列で表現できる!✓
10
◆,
✓01
◆
f
f
✓x
y
◆=
✓a
x
b
x
a
y
b
y
◆✓x
y
◆
✓10
◆
✓01
◆
✓ax
ay
◆
✓bx
by
◆
… f の行列表示f
同様に3次元ベクトルの線形変換は、 3次行列との積で書ける
f
0
@x
y
z
1
A = x
0
@a
x
a
y
a
z
1
A+ y
0
@b
x
b
y
b
z
1
A+ z
0
@c
x
c
y
c
z
1
A
=
0
@a
x
b
x
c
x
a
y
b
y
c
y
a
z
b
z
c
z
1
A
0
@x
y
z
1
A
f
0
@ax
ay
az
1
A
0
@bx
by
bz
1
A
0
@cx
cy
cz
1
A
線形変換の合成は行列の積に対応する
✓x
y
◆f
✓x
y
◆= A
✓x
y
◆g
✓f
✓x
y
◆◆= BA
✓x
y
◆
f g
g � f : f と g の合成f g左から作用
行列は線形変換の定量表現!
線形変換にはどんなものがある?
等倍・偏倍変換
A =
✓a 00 b
◆
✓10
◆
✓01
◆
f
✓a0
◆
✓0b
◆
回転
A =
✓cos✓ �sin✓
sin✓ cos✓
◆
✓10
◆
✓01
◆
f
✓cos ✓sin ✓
◆
✓� sin ✓cos ✓
◆
反転
A =
✓�1 00 1
◆✓
10
◆
✓01
◆
f
✓01
◆
✓�10
◆
正射影
A =
✓1 00 0
◆
✓10
◆
✓01
◆
f
✓10
◆
平行移動…?
✓10
◆
✓01
◆
f
✓pq
◆
とならない変換は線形でない!
f
✓00
◆=
✓00
◆
f
✓00
◆= f(
✓00
◆+
✓00
◆) = 2f
✓00
◆
f
より、
でなければいけない。
f
✓00
◆=
✓00
◆
✓pq
◆
えー、使えねぇ…
そんなことない!
xy 平面は xyz 空間の z=1 に浮いていると見る
✓x
y
◆
✓10
◆
✓01
◆
0
@001
1
A
0
@x
y
1
1
A
xy平面の線形変換は、 z=1上で行われていると見る
0
@a
x
b
x
0a
y
b
y
00 0 1
1
A
0
@x
y
1
1
A =
0
@
✓a
x
b
x
a
y
b
y
◆✓x
y
◆
1
1
A
z=1 のまま
の線形変換✓
x
y
◆
一方、こういう3次行列を考えれば、 z=1 上の点の平行移動が表現できる!
0
@1 0 p
0 1 q
0 0 1
1
A
0
@x
y
1
1
A =
0
@x+ p
y + q
1
1
A
z=1 は固定されたまま!
✓pq
◆平行移動
真横から見ると分かる!
x, y x, y
z z
z=1 z=1
0
@100
1
A ,
0
@010
1
A
0
@001
1
A
0
@100
1
A ,
0
@010
1
A
0
@pq1
1
A
: 不変
z=1ではxy平面の平行移動!
空間全体は線形変換0
@1 0 p0 1 q0 0 1
1
A
平面上の平行移動は線形ではないが、 空間内に埋め込めば線形変換として表現できる!
線形変換と平行移動を組み合わせたものを 「アフィン変換」という
0
@1 0 p0 1 q0 0 1
1
A
0
@ax
bx
0ay
by
00 0 1
1
A
アフィン変換も一つ上の次元から見れば、 ただの線形変換!
線形変換 平行移動
同様に xyz 空間も 4次元 xyzw 空間 において、 w=1 上に浮いてると考えれば、
xyz空間
w
0
BB@
0001
1
CCA
x, y, z
4次行列によって3次元空間の 線形変換・平行移動を表現できる!
0
BB@
ax
bx
cx
0ay
by
cy
0az
bz
cz
00 0 0 1
1
CCA
線形変換
0
BB@
1 0 0 p0 1 0 q0 0 1 r0 0 0 1
1
CCA
平行移動
これに加えて、 「射影変換」も一つ上の次元の行列で表現できる
(需要があればまた次回)
3Dレンダリングの座標変換は、 全て4次元行列の積で表現できる!
オブジェクト座標 ワールド座標 スクリーン座標
まとめ
1. 行列は線形変換の定量表現
2. 行列の積は変換の合成に対応
3. 次数をあげれば平行移動も射影も表現できる
Thanks!
Twitter: @taketo1024Blog: http://taketo1024.hateblo.jp