プログラマのための線形代数再入門

81
プログラマのための線形代数 “再” 入門 ~行列・線形変換・アフィン変換~ @taketo1024 2015/01/30 第1回プログラマのための数学勉強会

Upload: taketo-sano

Post on 15-Jul-2015

25.770 views

Category:

Science


3 download

TRANSCRIPT

Page 1: プログラマのための線形代数再入門

プログラマのための線形代数 “再” 入門 ~行列・線形変換・アフィン変換~

@taketo1024

2015/01/30 第1回プログラマのための数学勉強会

Page 2: プログラマのための線形代数再入門

今日の内容

1. 行列の積

2. 線形変換とアフィン変換

Page 3: プログラマのための線形代数再入門

1. 行列の積

Page 4: プログラマのための線形代数再入門

行列の足し算

✓3 54 10

◆+

✓3 45 8

◆=

✓3 + 3 5 + 44 + 5 10 + 8

=

✓6 99 18

Page 5: プログラマのための線形代数再入門

行列の掛け算

✓3 54 10

◆✓3 45 8

◆=

✓3 · 3 5 · 44 · 5 10 · 8

=

✓9 2020 80

Page 6: プログラマのための線形代数再入門

行列の掛け算

✓3 54 10

◆✓3 45 8

◆=

✓3 · 3 5 · 44 · 5 10 · 8

=

✓9 2020 80

◆×

こうだったら簡単だったのに…

Page 7: プログラマのための線形代数再入門

行列の掛け算

✓3 54 10

◆✓3 45 8

◆=

✓3 · 3 + 5 · 5 3 · 4 + 5 · 84 · 3 + 10 · 5 4 · 4 + 10 · 8

=

✓34 5262 96

これが正しい計算規則です。

Page 8: プログラマのための線形代数再入門

行列の掛け算

✓3 54 10

◆✓3 45 8

◆=

✓3 · 3 + 5 · 5 3 · 4 + 5 · 84 · 3 + 10 · 5 4 · 4 + 10 · 8

=

✓34 5262 96

Page 9: プログラマのための線形代数再入門

行列の掛け算

✓3 54 10

◆✓3 45 8

◆=

✓3 · 3 + 5 · 5 3 · 4 + 5 · 84 · 3 + 10 · 5 4 · 4 + 10 · 8

=

✓34 5262 96

Page 10: プログラマのための線形代数再入門

行列の掛け算

✓3 54 10

◆✓3 45 8

◆=

✓3 · 3 + 5 · 5 3 · 4 + 5 · 84 · 3 + 10 · 5 4 · 4 + 10 · 8

=

✓34 5262 96

Page 11: プログラマのための線形代数再入門

行列の掛け算

✓3 54 10

◆✓3 45 8

◆=

✓3 · 3 + 5 · 5 3 · 4 + 5 · 84 · 3 + 10 · 5 4 · 4 + 10 · 8

=

✓34 5262 96

Page 12: プログラマのための線形代数再入門

行列の掛け算

✓3 54 10

◆✓3 45 8

◆=

✓3 · 3 + 5 · 5 3 · 4 + 5 · 84 · 3 + 10 · 5 4 · 4 + 10 · 8

=

✓34 5262 96

Page 13: プログラマのための線形代数再入門

行列の掛け算

✓3 54 10

◆✓3 45 8

◆=

✓3 · 3 + 5 · 5 3 · 4 + 5 · 84 · 3 + 10 · 5 4 · 4 + 10 · 8

=

✓34 5262 96

Page 14: プログラマのための線形代数再入門

行列の掛け算

✓3 54 10

◆✓3 45 8

◆=

✓3 · 3 + 5 · 5 3 · 4 + 5 · 84 · 3 + 10 · 5 4 · 4 + 10 · 8

=

✓34 5262 96

Page 15: プログラマのための線形代数再入門

行列の掛け算

✓3 54 10

◆✓3 45 8

◆=

✓3 · 3 + 5 · 5 3 · 4 + 5 · 84 · 3 + 10 · 5 4 · 4 + 10 · 8

=

✓34 5262 96

Page 16: プログラマのための線形代数再入門

行列の掛け算

✓3 54 10

◆✓3 45 8

◆=

✓3 · 3 + 5 · 5 3 · 4 + 5 · 84 · 3 + 10 · 5 4 · 4 + 10 · 8

=

✓34 5262 96

Page 17: プログラマのための線形代数再入門

行列の掛け算

✓3 54 10

◆✓3 45 8

◆=

✓3 · 3 + 5 · 5 3 · 4 + 5 · 84 · 3 + 10 · 5 4 · 4 + 10 · 8

=

✓34 5262 96

Page 18: プログラマのための線形代数再入門

行列の掛け算

✓3 54 10

◆✓3 45 8

◆=

✓3 · 3 + 5 · 5 3 · 4 + 5 · 84 · 3 + 10 · 5 4 · 4 + 10 · 8

=

✓34 5262 96

Page 19: プログラマのための線形代数再入門

行列の掛け算

✓3 54 10

◆✓3 45 8

◆=

✓3 · 3 + 5 · 5 3 · 4 + 5 · 84 · 3 + 10 · 5 4 · 4 + 10 · 8

=

✓34 5262 96

ふぅ…

Page 20: プログラマのための線形代数再入門

正直、3×3以上の行列計算は地獄です。

(僕は必ず計算を間違うので気が狂いそうになる)

Page 21: プログラマのための線形代数再入門

なぜこう定義する?

Page 22: プログラマのための線形代数再入門

もんだい• さの工場では車とトラックを製造しています。

• 車の製造には作業員3人、ロボット5台の稼働が必要です。

• トラックの製造には作業員4人、ロボット8台の稼働が必要です。

• さの工場で車を2台、トラックを3台製造するのに必要な作業員とロボットの稼働はいくらでしょう?

Page 23: プログラマのための線形代数再入門

こたえ

車2台 : 2 ×(作業員:3人 + ロボット:5台)

トラック3台 : 3 ×(作業員:4人 + ロボット:8台)+)

作業員 ロボット

車 3人/台 5人/台

トラック 4台/台 8台/台

Page 24: プログラマのための線形代数再入門

こたえ

車2台 : 2 ×(作業員:3人 + ロボット:5台)

トラック3台 : 3 ×(作業員:4人 + ロボット:8台)+)

作業員:(2 × 3 + 3 × 4) = 18人、作業員 ロボット

車 3人/台 5人/台

トラック 4台/台 8台/台

Page 25: プログラマのための線形代数再入門

こたえ

車2台 : 2 ×(作業員:3人 + ロボット:5台)

トラック3台 : 3 ×(作業員:4人 + ロボット:8台)+)

作業員:(2 × 3 + 3 × 4) = 18人ロボット:(2 × 5 + 3 × 8) = 34台作業員 ロボット

車 3人/台 5人/台

トラック 4台/台 8台/台

Page 26: プログラマのための線形代数再入門

こたえ

車2台 : 2 ×(作業員:3人 + ロボット:5台)

トラック3台 : 3 ×(作業員:4人 + ロボット:8台)+)

作業員:(2 × 3 + 3 × 4) = 18人ロボット:(2 × 5 + 3 × 8) = 34台 こたえ

作業員 ロボット

車 3人/台 5人/台

トラック 4台/台 8台/台

Page 27: プログラマのための線形代数再入門

行列の積で書き直すと…

Page 28: プログラマのための線形代数再入門

(ベクトルは縦に書かないの?は後で説明します)

車・トラック

作業員・ロボット

�2 3

�✓ 3 54 8

◆=

�2 · 3 + 3 · 4 2 · 5 + 3 · 8

=�18 34

作業員 ロボット

車 3人/台 5人/台

トラック 4台/台 8台/台

Page 29: プログラマのための線形代数再入門

もんだい 2• 作業員はサンドイッチを2個食べ、コーヒーを3杯飲みます。

• ロボットはサンドイッチ6個、コーヒー10杯を燃料として動きます。

• さの工場で車を2台、トラックを3台製造するのに必要なサンドイッチとコーヒーはいくらでしょう?

Page 30: プログラマのための線形代数再入門

こたえSW COFFEE

作業員 2個/人 3杯/人

ロボット 6個/台 10杯/台

作業員 ロボット

車 3人/台 5人/台

トラック 4台/台 8台/台

✓3 54 8

◆ ✓2 36 10

Page 31: プログラマのための線形代数再入門

こたえ

�2 3

�✓ 3 54 8

◆=

�18 34

SW COFFEE

作業員 2個/人 3杯/人

ロボット 6個/台 10杯/台

作業員 ロボット

車 3人/台 5人/台

トラック 4台/台 8台/台 車・トラック 作業員・ロボット

Page 32: プログラマのための線形代数再入門

こたえ

�2 3

�✓ 3 54 8

◆=

�18 34

�18 34

�✓ 2 36 10

◆=

�240 394

SW COFFEE

作業員 2個/人 3杯/人

ロボット 6個/台 10杯/台

作業員 ロボット

車 3人/台 5人/台

トラック 4台/台 8台/台 車・トラック 作業員・ロボット

作業員・ロボット

Page 33: プログラマのための線形代数再入門

こたえ

�2 3

�✓ 3 54 8

◆=

�18 34

�18 34

�✓ 2 36 10

◆=

�240 394

SW COFFEE

作業員 2個/人 3杯/人

ロボット 6個/台 10杯/台

作業員 ロボット

車 3人/台 5人/台

トラック 4台/台 8台/台

こたえ

車・トラック 作業員・ロボット

サンドイッチ・コーヒー作業員・ロボット

Page 34: プログラマのための線形代数再入門

まとめて書けば:

�2 3

�✓ 3 54 8

◆✓2 36 10

◆=

�18 34

�✓ 2 36 10

=�240 394

Page 35: プログラマのための線形代数再入門

まとめて書けば:

�2 3

�✓ 3 54 8

◆✓2 36 10

◆=

�18 34

�✓ 2 36 10

=�240 394

�先にこっちを計算すると…

Page 36: プログラマのための線形代数再入門

まとめて書けば:

�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

Page 37: プログラマのための線形代数再入門

まとめて書けば:

�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

Page 38: プログラマのための線形代数再入門

まとめて書けば:

�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

Page 39: プログラマのための線形代数再入門

まとめて書けば:

�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

Page 40: プログラマのための線形代数再入門

まとめて書けば:

�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

�同じ!

Page 41: プログラマのための線形代数再入門

�18 34

つまりこういうこと✓

3 54 8

◆ ✓2 36 10

車・トラック 作業員・ロボット サンドイッチ・コーヒー

�52 95

� �240 394

Page 42: プログラマのための線形代数再入門

�18 34

つまりこういうこと✓

3 54 8

◆ ✓2 36 10

車・トラック 作業員・ロボット サンドイッチ・コーヒー

�52 95

✓36 5956 92

一発でいける!

�240 394

Page 43: プログラマのための線形代数再入門

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

行列の掛け算は、対応表の合成になっていた!打ち消しあう

Page 44: プログラマのための線形代数再入門

もんだい 3

• では車を52台、トラックを95台製造するのに必要なサンドイッチとコーヒーは?

Page 45: プログラマのための線形代数再入門

こたえ

�18 34

� �240 394

✓3 54 8

◆ ✓2 36 10

車・トラック 作業員・ロボット サンドイッチ・コーヒー

�52 95

�… …

Page 46: プログラマのための線形代数再入門

�18 34

こたえ✓

3 54 8

◆ ✓2 36 10

車・トラック 作業員・ロボット サンドイッチ・コーヒー

�52 95

�…

✓36 5956 92

◆一発でいきましょう

�240 394

�…

Page 47: プログラマのための線形代数再入門

�18 34

こたえ✓

3 54 8

◆ ✓2 36 10

車・トラック 作業員・ロボット サンドイッチ・コーヒー

�52 95

�…

✓36 5956 92

�7192 11808

こたえ

Page 48: プログラマのための線形代数再入門

行列の積は変換の合成と対応する形で 定義されていた!

�x y

� �x y

�A

�x y

�AB

A B

AB

あらかじめ積を計算しておけば、中間をすっ飛ばせる!

Page 49: プログラマのための線形代数再入門

ちなみに数学ではベクトルを縦に書き、行列を左から掛けることが多い

A B

✓x

y

◆A

✓x

y

◆BA

✓x

y

BA 順序に注意!

と書く場合はこっちの方が分かりやすいf(~x) = A~x

Page 50: プログラマのための線形代数再入門

「転置」を取れば同じ計算になる

�2 3

�✓ 3 54 8

◆✓2 36 10

◆=

�240 394

✓2 63 10

◆✓3 45 8

◆✓23

◆=

✓240394

左から作用

右から作用

… DirectX 系

… OpenGL 系

Page 51: プログラマのための線形代数再入門

以後、変換について話すので後者のスタイルで書きます。

(DirectX 系の人は脳内転置お願いします)

Page 52: プログラマのための線形代数再入門

2. 線形変換とアフィン変換

Page 53: プログラマのための線形代数再入門

線形変換

ベクトルの線形性(平行と比率)の保たれる変換

f

Page 54: プログラマのための線形代数再入門

線形変換

… 和をバラせる

… 実数倍をバラせる

(f(~x+ ~y) = f(~x) + f(~y)

f(a · ~x) = a · f(~x)

Page 55: プログラマのための線形代数再入門

✓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

Page 56: プログラマのための線形代数再入門

その結果は行列とベクトルの積で書ける!

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

Page 57: プログラマのための線形代数再入門

つまり線形変換は の行き先を並べた行列で表現できる!✓

10

◆,

✓01

f

f

✓x

y

◆=

✓a

x

b

x

a

y

b

y

◆✓x

y

✓10

✓01

✓ax

ay

✓bx

by

… f の行列表示f

Page 58: プログラマのための線形代数再入門

同様に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

Page 59: プログラマのための線形代数再入門

線形変換の合成は行列の積に対応する

✓x

y

◆f

✓x

y

◆= A

✓x

y

◆g

✓f

✓x

y

◆◆= BA

✓x

y

f g

g � f : f と g の合成f g左から作用

Page 60: プログラマのための線形代数再入門

行列は線形変換の定量表現!

Page 61: プログラマのための線形代数再入門

線形変換にはどんなものがある?

Page 62: プログラマのための線形代数再入門

等倍・偏倍変換

A =

✓a 00 b

✓10

✓01

f

✓a0

✓0b

Page 63: プログラマのための線形代数再入門

回転

A =

✓cos✓ �sin✓

sin✓ cos✓

✓10

✓01

f

✓cos ✓sin ✓

✓� sin ✓cos ✓

Page 64: プログラマのための線形代数再入門

反転

A =

✓�1 00 1

◆✓

10

✓01

f

✓01

✓�10

Page 65: プログラマのための線形代数再入門

正射影

A =

✓1 00 0

✓10

✓01

f

✓10

Page 66: プログラマのための線形代数再入門

平行移動…?

✓10

✓01

f

✓pq

Page 67: プログラマのための線形代数再入門

とならない変換は線形でない!

f

✓00

◆=

✓00

f

✓00

◆= f(

✓00

◆+

✓00

◆) = 2f

✓00

f

より、

でなければいけない。

f

✓00

◆=

✓00

✓pq

Page 68: プログラマのための線形代数再入門

えー、使えねぇ…

Page 69: プログラマのための線形代数再入門

そんなことない!

Page 70: プログラマのための線形代数再入門

xy 平面は xyz 空間の z=1 に浮いていると見る

✓x

y

✓10

✓01

0

@001

1

A

0

@x

y

1

1

A

Page 71: プログラマのための線形代数再入門

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

Page 72: プログラマのための線形代数再入門

一方、こういう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

◆平行移動

Page 73: プログラマのための線形代数再入門

真横から見ると分かる!

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

Page 74: プログラマのための線形代数再入門

平面上の平行移動は線形ではないが、 空間内に埋め込めば線形変換として表現できる!

Page 75: プログラマのための線形代数再入門

線形変換と平行移動を組み合わせたものを 「アフィン変換」という

0

@1 0 p0 1 q0 0 1

1

A

0

@ax

bx

0ay

by

00 0 1

1

A

アフィン変換も一つ上の次元から見れば、 ただの線形変換!

線形変換 平行移動

Page 76: プログラマのための線形代数再入門

同様に xyz 空間も 4次元 xyzw 空間 において、 w=1 上に浮いてると考えれば、

xyz空間

w

0

BB@

0001

1

CCA

x, y, z

Page 77: プログラマのための線形代数再入門

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

平行移動

Page 78: プログラマのための線形代数再入門

これに加えて、 「射影変換」も一つ上の次元の行列で表現できる

(需要があればまた次回)

Page 79: プログラマのための線形代数再入門

3Dレンダリングの座標変換は、 全て4次元行列の積で表現できる!

オブジェクト座標 ワールド座標 スクリーン座標

Page 80: プログラマのための線形代数再入門

まとめ

1. 行列は線形変換の定量表現

2. 行列の積は変換の合成に対応

3. 次数をあげれば平行移動も射影も表現できる

Page 81: プログラマのための線形代数再入門

Thanks!

Twitter: @taketo1024Blog: http://taketo1024.hateblo.jp