行列と行列の積

回 6-2 分野 6 ベクトルと行列

行列の積 AB の i 行 j 列の数は、A の i 行目と B の j 列目の内積です。A が m 行 n 列、B が n 行 p 列なら、積は m 行 p 列になり、A の列の数と B の行の数がそろわないと積は作れません。n 行 n 列どうしの積を定義どおりに計算すると、掛け算は n³ 回です。AB と BA は、一般には等しくありません。

行列の積を 3 重のループで書き、掛け算を 1 回ずつ数えて、計算のやり方と手間の増え方を確かめます。

行列の積は、なぜ「行 × 列」で計算するのか

行列の積は、左の行列の「行」と右の行列の「列」を組にして、内積を取る計算です。決め方が独特なので、手順だけ覚えても、なぜそうなるのかが分かりにくい所です。

けれど、ニューラルネットの 1 層の計算も、画像の回転と拡大も、中身は行列の積です。生成 AI が大量の GPU を使う理由の多くは、巨大な行列の積を何度も計算するためです。

この回では、行列の積のやり方を 3 重のループで書き、掛け算の回数を 1 回ずつ数えて確かめます。

行列と、積のやり方

行列は数の表

行列は、数を縦と横に並べた表です。横の並びを行、縦の並びを列と呼び、行が 2 つで列が 3 つなら「2 行 3 列」(2×3) の行列です。i 行 j 列にある数を (i, j) 成分と呼びます。

高校の数学 C でも、行列は数を表の形に並べて事柄を表す方法として扱われます。プログラムでは、行のリストを並べたリストで持ちます。2×3 の行列は [[1, 2, 3], [4, 5, 6]] です。

積の 1 つの数は、行と列の内積

A と B の積 AB の (i, j) 成分は、A の i 行目と B の j 列目の内積 (同じ番目どうしを掛けて足した数、6-1) です。

2×2 の例で、A = [[1, 2], [3, 4]]、B = [[5, 6], [7, 8]] とします。

成分A の行と B の列計算値
(1, 1)行 (1, 2)、列 (5, 7)1 × 5 + 2 × 719
(1, 2)行 (1, 2)、列 (6, 8)1 × 6 + 2 × 822
(2, 1)行 (3, 4)、列 (5, 7)3 × 5 + 4 × 743
(2, 2)行 (3, 4)、列 (6, 8)3 × 6 + 4 × 850

AB = [[19, 22], [43, 50]] です。

積が作れる大きさの決まり

行と列の内積を取るには、A の行の長さ (A の列の数) と、B の列の長さ (B の行の数) がそろっている必要があります。

ABAB
m 行 n 列n 行 p 列m 行 p 列
2×33×22×2
3×22×33×3
2×32×3作れない

内側の 2 つの数 (n と n) がそろうと積が作れ、外側の 2 つの数 (m と p) が積の大きさになります。

掛け算の回数は m × n × p

AB の成分は m × p 個あり、1 つの成分に n 回の掛け算を使います。全部で m × n × p 回です。n 行 n 列どうしなら n³ 回で、n が 2 倍になると掛け算は 8 倍になります。

AB と BA は、一般には違う

数の掛け算は 3 × 5 = 5 × 3 ですが、行列の積は順を入れ替えると答えが変わることがあります。大きさが違えば、片方しか作れないこともあります。2×3 と 3×2 の積は、AB が 2×2、BA が 3×3 で、大きさからして違います。

一方、次の性質は成り立ちます。

性質式
結合法則(AB)C = A(BC)
分配法則A(B + C) = AB + AC
単位行列AI = IA = A

単位行列 I は、左上から右下の斜めが 1 で、ほかが 0 の行列です。数の 1 と同じく、掛けても相手を変えません。

なぜこの決め方なのか

行列は「ベクトルを別のベクトルに移す決まり」を表せます。たとえば [[0, −1], [1, 0]] は、平面の点を 90° 回す決まりです。点 x を B で移し、続けて A で移した結果は A(Bx) です。これを 1 つの行列で表した物が AB で、そうなるように積の決め方が選ばれています。だから順を入れ替えると、「先に回してから伸ばす」と「先に伸ばしてから回す」のように、違う変換になります。

成分ごとの積とは違う

同じ大きさの 2 つの行列の、同じ場所どうしを掛ける計算もあり、成分ごとの積 (アダマール積) と呼びます。行列の積とは別物です。Python の数値計算でよく使う NumPy では、* が成分ごとの積、@ が行列の積です。取り違えると、大きさがたまたま合っていて、止まらずに違う答えが出ることがあります。

動かして確かめる

1 本目は、行列の積を 3 重のループで書きます。大きさがそろわないときは止めます。掛け算の回数も数えます。

動かす 3 重ループで行列の積

python実行可能
出力

▶ 実行ボタンを押すと結果がここに表示されます

実行すると、次の通りに出ます

[19, 22]
[43, 50]
掛け算 8 回
[7, 8]
[16, 17]
掛け算 12 回
[1, 2, 3]
[4, 5, 6]
[10, 14, 18]
掛け算 18 回
[5, 2, 2]
[0, 1, 1]
[5, 6, 1]
掛け算 27 回
作れない 3 2

2×2 どうしの積は [[19, 22], [43, 50]] で、上の表と同じです。掛け算は 2 × 2 × 2 = 8 回でした。2×3 と 3×2 の積 PQ は 2×2 で 12 回、QP は 3×3 で 18 回です。PQ と QP は大きさから違います。3×3 どうしの積は、成分 9 個にそれぞれ 3 回で、掛け算は 27 回です。たとえば (1, 1) 成分は、1 行目 (1, 0, 2) と 1 列目 (1, 0, 2) の内積で 1 + 0 + 4 = 5 です。2×3 どうしは、左の列の数 3 と右の行の数 2 がそろわないので、作れません。最後の行の 3 と 2 は、その 2 つの数です。

2 本目は、n 行 n 列どうしの積で、掛け算の回数が n³ になるかを数えます。中身はどの数でも回数は同じなので、全部 1 の行列を使います。

動かす 掛け算の回数を数える

python実行可能
出力

▶ 実行ボタンを押すと結果がここに表示されます

実行すると、次の通りに出ます

1 1 True
2 8 True
4 64 True
8 512 True
16 4096 True
32 32768 True

n が 2 倍になるたびに、掛け算は 8 倍になります。32 行 32 列で 32,768 回です。1,000 行 1,000 列なら 10 億回で、これが GPU のような並べて計算する道具が要る理由です。

3 本目は、AB と BA が違うこと、単位行列を掛けても変わらないこと、ニューラルネットの 1 層が行列とベクトルの積であることを確かめます。

動かす 順、単位行列、ニューラルネットの 1 層

python実行可能
出力

▶ 実行ボタンを押すと結果がここに表示されます

実行すると、次の通りに出ます

AB [[2, 1], [4, 3]]
BA [[3, 4], [1, 2]]
AI [[1, 2], [3, 4]]
1 層 [4.6, 0]

B = [[0, 1], [1, 0]] は列や行を入れ替える行列です。AB は A の列を入れ替え、BA は A の行を入れ替えるので、答えが違います。単位行列を掛けた AI は A のままです。

最後の 4 行は、入力 3 つ、出力 2 つの小さなニューラルネットの 1 層です。重み W (2×3) と入力 x (3×1) の積に b を足し、負の数を 0 にする関数 (ReLU) を通しています。ReLU は max(0, 値) で、負の数を 0 にし、0 以上の数はそのまま通します。

4 本目は、3 つの行列を掛ける順で、掛け算の回数が変わることを確かめます。結合法則で答えは同じでも、手間は同じではありません。

動かす 掛ける順で回数が変わる

python実行可能
出力

▶ 実行ボタンを押すと結果がここに表示されます

実行すると、次の通りに出ます

(AB)C 7500
A(BC) 75000
倍 10

10×100、100×5、5×50 の 3 つを掛けるとき、先に AB を作ると 7,500 回、先に BC を作ると 75,000 回で、10 倍違います。答えの行列は同じです。大きな計算では、どの順に掛けるかで速さが大きく変わります。

定義どおりに計算すると外れる所

大きさの取り違えは、止まらないことがある

2×2 どうしや 3×3 どうしのように、どちらの順でも積が作れる場合は、A と B を入れ替えても止まらずに、違う答えが出ることがあります (AB と BA がたまたま等しい組もあります)。成分ごとの積と行列の積の取り違えも同じです。結果の大きさだけでなく、小さな例で手計算と照らします。

n³ より速い計算の仕方もある

定義どおりの 3 重ループは n³ 回の掛け算ですが、より少ない掛け算で済ませる方法も知られています。1969 年に Strassen が示した方法は、2×2 の積を 8 回ではなく 7 回の掛け算で作り、それを繰り返して約 n^2.81 回にします。一方、NumPy のような道具が中で使う BLAS と呼ばれる行列計算の部品の多くは、掛け算の回数は定義どおりのまま、メモリの読み方と、たくさんの掛け算を並べて行う工夫で速くしています。

小数の積は、足す順で末尾が変わる

小数の足し算は、足す順で末尾の桁がわずかに変わることがあります。同じ行列の積でも、道具や GPU が違うと、最後の桁が合わないことがあります。小数の結果を比べるときは、ぴったり同じかではなく、差が十分小さいかで比べます。

仕事でどう使うか

行列の積を使う場面は、次の通りです。

  • ニューラルネット。1 つの層は「重みの行列 × 入力」に定数を足して、活性化の関数を通す計算。何枚もの入力をまとめて行列にし、1 回の積で一度に計算する
  • 生成 AI の手間の見積もり。模型の大きさと入力の長さから、行列の積の掛け算の回数を出すと、必要な計算の量の当たりが付く
  • 画像と 3D の変換。回転、拡大、移動を行列で表し、続けて行う変換を 1 つの行列にまとめてから、たくさんの点に掛ける
  • 推薦。利用者 × 商品の表を、小さな 2 つの行列の積で近づけて、空いた所 (まだ買っていない商品) の数を予想する
  • グラフ。つながりの表 (隣接行列、6-3) を 2 回掛けると、2 歩で行ける道の数が分かる

よくある問い

行列の積はどうやって計算しますか

答えの (i, j) 成分に、左の行列の i 行目と右の行列の j 列目の内積を入れます。これを全部の i と j の組で繰り返します。2×2 なら 4 つの成分を、それぞれ 2 回の掛け算と 1 回の足し算で出します。

行列の積が作れないのはどんなときですか

左の行列の列の数と、右の行列の行の数が違うときです。2×3 と 2×3 は、3 と 2 がそろわないので作れません。2×3 と 3×4 なら作れて、答えは 2×4 です。

AB と BA はいつ等しくなりますか

一般には等しくありませんが、等しくなる組もあります。単位行列 I と A は、AI = IA = A です。同じ行列どうし (A と A) も、もちろん等しくなります。等しいかどうかは、組ごとに計算して確かめます。

Python で行列の積を計算するには

標準の Python だけなら、この頁の 1 本目のように 3 重のループで書けます。大きな行列では、NumPy の @ を使います。NumPy は内部で速い計算の仕組みを使うので、自分で書いたループより桁違いに速くなります。

確認クイズ

答えだと思う選択肢を押すと、その場で正誤と理由が開きます。3 問すべてに正しく答えると、この回は修了で、石が緑に変わります (この端末のブラウザに残ります)。間違えた問いは、あとから解き直せます。

1 問目

A = [[2, 0], [1, 3]]、B = [[1, 4], [2, 1]] のとき、AB の (2, 1) 成分はいくつですか。

2 問目

A が 4 行 3 列、B が 3 行 5 列です。AB の大きさと、定義どおりに計算したときの掛け算の回数の組はどれですか。

3 問目

このコードを動かすと何が出ますか。

A = [[1, 2], [3, 4]]
B = [[1, 0], [0, 2]]
print([[sum(a * b for a, b
             in zip(r, c))
        for c in zip(*B)]
       for r in A])

説明課題

「n 行 n 列の 2 つの行列の積を定義どおりに計算すると、n が 10 倍になったとき手間はおよそ何倍になるか」を、成分の数と 1 つの成分の掛け算の回数から 3 文で説明してください。書いたら、下の模範解答を開いて比べてください。

模範解答

自分の説明を書いてから開いて、比べてください。

この回の先の一歩

行列の積の手間を大きさから見積もれると、AI の模型がなぜ GPU を要するのか、どこを小さくすると速くなるのかを数で話せます。いまの自分が転職までの道のどの段にいるかは、転職診断で確かめられます。

もっと深く

この回の続きを、ゆめさくのコースの章や道具で深められます。頁の中の確認クイズに答えたあと、手を動かす量を増やしたいときに使ってください。

一次資料

どれも 2026年10月30日に開いて、題と中身を確かめました。

次へ

分野 6 ベクトルと行列の回

  1. 6-1ベクトルと内積長さ、内積、コサイン類似度頁で読む
  2. 6-2行列と行列の積積の数え方、計算量 n^3この回
  3. 6-3グラフと隣接行列頂点、辺、次数、隣接リスト頁で読む

分野 6 の頁へ戻るほかの分野を見る