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

Post on 15-Jul-2015

25.770 Views

Category:

Science

3 Downloads

Preview:

Click to see full reader

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

top related