行列は数の表である
行列とは、数を縦と横に並べた表です。行列にベクトルや別の行列を掛けると、たくさんの足し算と掛け算を、1回の計算にまとめられます。
コンビニの2日分の売れた数と、品物の値段があります。売上の合計は、行列の掛け算で、2日分が同時に出ます。
このレッスンのゴール
メモ
行列にベクトルを掛け、行列に別の行列を掛けることができる。
キーワード
| ことば | いみ |
|---|---|
| 行列 | 数を縦と横に並べた表 |
| 行 | 行列の横の並び |
| 列 | 行列の縦の並び |
| 形 | 行の数と列の数。2行3列を 2×3 と書く |
| 積 | 掛け算の結果。行列どうしの積は、行と列で作る |
学生が入力するセルは、このプレビューでは空白です。
行列とベクトルの積は行ごとのドット積
行列の行を1本ずつ取り出し、ベクトルとのドット積を求めます。その結果を、行の順に並べたものが、行列とベクトルの積です。
行列が2行なら、結果の成分は2つです。行の長さは、ベクトルの成分の数と同じでなければなりません。
例: 2日分の売上
| 日 | 売れた数(おにぎり、お茶、パン) | 計算 | 売上 |
|---|---|---|---|
| 月曜 | [10, 5, 2] | 10 × 150 + 5 × 140 + 2 × 200 | 2600 円 |
| 火曜 | [8, 6, 4] | 8 × 150 + 6 × 140 + 4 × 200 | 2840 円 |
学生が入力するセルは、このプレビューでは空白です。
行とベクトルのドット積
# 月曜の売れた数と、1つめの店の値段です。
monday = [10, 5, 2]
shop_one = [150, 140, 200]
# 行の成分と列の成分を、同じ位置どうしで掛けて足します。
sales = 0
for i in range(3):
sales = sales + monday[i] * shop_one[i]
print("月曜の売上:", sales, "円")
# monday の 2 を 0 に変えると、売上はいくら減りますか。
NumPy で行列とベクトルを掛ける
docker exec jupyter python3 -c "import numpy as np; a = np.array([[10, 5, 2], [8, 6, 4]]); p = np.array([150, 140, 200]); print(a.shape, a @ p)"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
行列どうしの積は列ごとに作る
2店の値段を、2つの列にして並べると、値段の行列が作れます。左の行列の行と、右の行列の列のドット積を、すべての組で求めます。
2×3 の行列と 3×2 の行列を掛けると、2×2 の行列になります。左の列の数と、右の行の数が合うことが条件です。
例: 2日と2店の売上
| 日 | 店1(150、140、200) | 店2(160、130、210) |
|---|---|---|
| 月曜 [10, 5, 2] | 2600 | 1600 + 650 + 420 = 2670 |
| 火曜 [8, 6, 4] | 2840 | 1280 + 780 + 840 = 2900 |
学生が入力するセルは、このプレビューでは空白です。
よくある間違い
注意
多くの人は、行列の積を、同じ位置どうしの掛け算だと考えます。行列の積は行と列のドット積で、順番も大切です。AB と BA は、ふつう違う行列になります。
掛ける順番を入れ替える
# 2つの2行2列の行列です。掛ける順番を入れ替えます。
a = [[1, 2], [3, 4]]
b = [[0, 1], [1, 0]]
ab = [[0, 0], [0, 0]]
ba = [[0, 0], [0, 0]]
for r in range(2):
for c in range(2):
for k in range(2):
ab[r][c] = ab[r][c] + a[r][k] * b[k][c]
ba[r][c] = ba[r][c] + b[r][k] * a[k][c]
print("a と b の積:", ab)
print("b と a の積:", ba)
# a の 4 を 5 に変えて、2つの積が変わるところを確かめてください。
2日と2店の売上を一度に出す
docker exec jupyter python3 -c "import numpy as np; a = np.array([[10, 5, 2], [8, 6, 4]]); p = np.array([[150, 160], [140, 130], [200, 210]]); print(a @ p)"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
星と @ の違いを確かめる
docker exec jupyter python3 -c "import numpy as np; a = np.array([[1, 2], [3, 4]]); b = np.array([[0, 1], [1, 0]]); print(a * b); print(a @ b)"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
さらに挑戦: 単位行列
対角線が 1 で、ほかが 0 の正方形の行列を、単位行列といいます。2×2 では [[1, 0], [0, 1]] です。
どんな行列に掛けても、結果は元の行列のままです。[[1, 2], [3, 4]] に掛けて、確かめましょう。