行列は点を動かす装置である
行列は、平面の点を別の点へ動かす変換として読めます。拡大、縮小、反転、回転は、どれも小さな行列の掛け算です。
写真アプリで画像を回したり広げたりするとき、画面のすべての点に、同じ行列が掛けられています。
このレッスンのゴール
メモ
2行2列の行列を、回転、拡大縮小、反転のどれかとして読むことができる。
キーワード
| ことば | いみ |
|---|---|
| 変換 | 点を別の点へ動かす決まり |
| 拡大縮小 | 各方向の長さを何倍かにする変換 |
| 反転 | 軸をはさんで、点を反対側に映す変換 |
| 回転 | 原点を中心に、点を角度だけ回す変換 |
| 合成 | 変換を続けて行うこと。行列の積になる |
学生が入力するセルは、このプレビューでは空白です。
2行2列の行列は点を動かす
点 [x, y] に2行2列の行列を掛けると、新しい点が得られます。行列の1列目は、点 [1, 0] の行き先で、2列目は、点 [0, 1] の行き先です。
この2つの行き先が決まると、ほかの点の行き先も、すべて決まります。
例: 点 [3, 1] を動かす
| 変換 | 行列 | [3, 1] の行き先 |
|---|---|---|
| 縦横2倍 | [[2, 0], [0, 2]] | [6, 2] |
| 横だけ3倍 | [[3, 0], [0, 1]] | [9, 1] |
| 上下反転 | [[1, 0], [0, -1]] | [3, -1] |
| 90度回転 | [[0, -1], [1, 0]] | [-1, 3] |
学生が入力するセルは、このプレビューでは空白です。
3つの点を拡大する
# 横に2倍、縦に3倍にする行列を、3つの点に掛けます。
matrix = [[2, 0], [0, 3]]
corners = [[1, 1], [2, 0], [0, 4]]
for p in corners:
x = matrix[0][0] * p[0] + matrix[0][1] * p[1]
y = matrix[1][0] * p[0] + matrix[1][1] * p[1]
print(p, "->", [x, y])
# matrix の 3 を -3 に変えると、点はどう動きますか。
NumPy で90度回転する
docker exec jupyter python3 -c "import numpy as np; r = np.array([[0, -1], [1, 0]]); p = np.array([3, 1]); print(r @ p)"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
回転の行列は角度から作る
角度を θ とすると、回転の行列は [[cos θ, -sin θ], [sin θ, cos θ]] です。cos と sin は、角度から決まる2つの数です。
0度なら何も動かず、90度なら点 [1, 0] は [0, 1] へ、180度なら原点の反対側へ動きます。長さは変わりません。
例: 角度と回転の行列
| 角度 | cos と sin | 行列 |
|---|---|---|
| 0度 | 1 と 0 | [[1, 0], [0, 1]] |
| 90度 | 0 と 1 | [[0, -1], [1, 0]] |
| 180度 | -1 と 0 | [[-1, 0], [0, -1]] |
| 45度 | 約 0.71 と約 0.71 | [[0.71, -0.71], [0.71, 0.71]] |
学生が入力するセルは、このプレビューでは空白です。
角度から回転の行列を作る
docker exec jupyter python3 -c "import numpy as np; t = np.radians(90); r = np.array([[np.cos(t), -np.sin(t)], [np.sin(t), np.cos(t)]]); print(np.round(r @ np.array([3, 1]), 6))"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
角度から点を回す
import math
# 角度から、回転の行列の4つの数を作ります。
angle = math.radians(90)
c = math.cos(angle)
s = math.sin(angle)
point = [3, 1]
x = c * point[0] - s * point[1]
y = s * point[0] + c * point[1]
print("回転した点:", round(x, 6), round(y, 6))
# 90 を 180 に変えて、点がどこに行くか予想してから実行してください。
変換を続けると行列の積になる
回転してから横に3倍にする、という2つの変換を続けると、1つの行列にまとめられます。先に行う変換の行列は、右側に書きます。
順番を入れ替えると、結果が変わります。行列の積で、AB と BA が違うのと同じ理由です。
例: 順番で行き先が変わる
| 順番 | 合成の行列 | [3, 1] の行き先 |
|---|---|---|
| 回転してから横3倍 | [[0, -3], [1, 0]] | [-3, 3] |
| 横3倍してから回転 | [[0, -1], [3, 0]] | [-1, 9] |
学生が入力するセルは、このプレビューでは空白です。
よくある間違い
注意
多くの人は、先に行う変換を、左に書きます。行列では、最初の変換が、点に近い右側に来ます。「回転してから拡大」は、拡大の行列に回転の行列を右から掛けたものです。
合成の行列を確かめる
docker exec jupyter python3 -c "import numpy as np; s = np.array([[3, 0], [0, 1]]); r = np.array([[0, -1], [1, 0]]); print(s @ r); print(r @ s)"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
さらに挑戦: 元に戻す回転
90度の回転を4回続けると、点は元の場所に戻ります。つまり、4回分の積は、単位行列です。
30度回してから、-30度回すと、どうなるでしょうか。ノートブックで、2つの積を求めて、予想と比べましょう。