【Pythonで学ぶ線形代数学講座(16)】拡大(縮小)行列
拡大(縮小)行列
ベクトルを引き伸ばす行列
ベクトルの長さを
で与えられます。実際、行列
となります。このような行列
と表せます。コードライブラリ にある coordinate() と visual_vector() を実装して以下のコードを実行すると、ベクトル
# python_augmented_matrix
# In[1]
import numpy as np
import matplotlib.pyplot as plt
# ここにcoordinate()を実装
# ここにvisual_vector()を実装
# 4×8サイズのFigureを設置
# 2行1列のサブプロット(Axes)を追加してx軸は共有する
fig, ax = plt.subplots(2, 1, sharex = "col", figsize=(4, 8))
# 座標を設定
coordinate(ax[0], [0, 6], [0, 6], xlabel = "")
coordinate(ax[1], [0, 6], [0, 6])
# 拡大縮小行列a
a = 2 * np.eye(2, dtype = np.int)
# ベクトルの始点
loc = np.array([1, 1])
# ベクトルv0
v0 = np.array([2, 1])
# ベクトルv0を拡大縮小行列aで変換
v1 = np.dot(a, v0)
# ベクトルv0,v1を表示
visual_vector(ax[0], loc, v0, color = "red")
visual_vector(ax[1], loc, v1, color = "blue")
plt.show()
領域の拡大縮小
拡大縮小行列
# In[2]
# FigureとAxesを作成
fig, ax = plt.subplots(1, 1, figsize=(5, 5))
# 座標を設定
coordinate(ax, [0, 6], [0, 6])
# 拡大縮小行列a
a = 2 * np.eye(2, dtype = np.int)
# 正方形のデータを格子点として作成
x = np.linspace(1, 2, 65)
y = np.linspace(1, 2, 65)
X, Y = np.meshgrid(x, y)
# XとYの次元を下げてベクトルに変換
X = X.reshape(-1)
Y = Y.reshape(-1)
# XとYを縦に連結してベクトルが横に並ぶ行列を作成
s0 = np.vstack((X, Y))
# 領域s0を拡大縮小行列aで変換
s1 = np.dot(a, s0)
# 変換前の領域s0と変換後の領域s1を表示
ax.scatter(s0[0], s0[1], s = 5, color = "red")
ax.scatter(s1[0], s1[1], s = 5, color = "blue")
plt.show()
コンピュータでは画像も配列データなので、画像の拡大・縮小なども配列操作によって実行されます。
無限集合の写像
コンピュータでは領域を有限個の点の集合として近似しますが、数学では有限領域であっても、その中に無限個の点が含まれています (数直線がいくらでも小さく分割できるのと同じ理屈です)。
そして写像とは点と点の 1 対 1 の対応ですから、変換前と変換後、それぞれの領域に含まれる個数は一致します。これはつまり、領域の大きさに関わらず、含まれる点の個数は同じであることを意味しています。
たとえば、
コメント