Excel関数 逆引き集 | 行列の積 → MMULT

Excel
スポンサーリンク

概要

MMULT 関数は、「2 つの行列(配列)の行列積」を計算する関数です。
数学でいう

C=A×B

を、そのまま Excel 上でやってくれるイメージです。

結果は「行数=第1引数の行数」「列数=第2引数の列数」の行列として返されます。
動的配列対応版の Excel なら、左上の 1 セルに式を入れて Enter するだけで、結果の行列が一気にスピルします。


MMULT 関数の基本

書式と意味

=MMULT(array1, array2)

array1:左側の行列(配列)
array2:右側の行列(配列)

行列積が定義されるためには、array1 の列数 = array2 の行数である必要があります。
結果の行列は「array1 の行数 × array2 の列数」のサイズになります

例えば、
array1 が 2×3 行列、array2 が 3×2 行列なら、結果は 2×2 行列になります。


行列積のイメージ(中身で何をしているか)

計算ルールのざっくりイメージ

行列積 (C = A \times B) の要素 (c_{ij}) は、
「A の i 行目」と「B の j 列目」の内積(要素ごとの掛け算の合計)です。

cij=kaikbkj

Excel の MMULT も、内部でこの計算を行っています。


コード例(2×2 行列の積)

2×2 行列同士の掛け算

次のような 2×2 行列を考えます。

A1:B2 に行列 A
A1:1 B1:2
A2:3 B2:4

D1:E2 に行列 B
D1:5 E1:6
D2:7 E2:8

このとき、行列 C = A×B を求めたいとします。
結果は 2×2 行列なので、例えば G1:H2 を結果の領域とします。

G1 に次の式を入力します。

=MMULT(A1:B2, D1:E2)

動的配列対応の Excel なら、そのまま Enter で G1:H2 に結果がスピルします。
古いバージョンでは、G1:H2 を選択 → 数式バーに式入力 → Ctrl+Shift+Enter で配列数式として確定します。

この計算の中身は、手計算で書くと次のようになります。

  • C11 = 1×5 + 2×7
  • C12 = 1×6 + 2×8
  • C21 = 3×5 + 4×7
  • C22 = 3×6 + 4×8

MMULT はこれを一気にやってくれる、というイメージです。


コード例(ベクトル×行列・行列×ベクトル)

行列×列ベクトル(線形変換のイメージ)

A1:B2 に 2×2 行列 A
D1:D2 に 2×1 ベクトル v があるとします。

A1:a11 B1:a12
A2:a21 B2:a22

D1:v1 D2:v2

このとき、w = A×v(2×1 ベクトル)を求めるには、
結果を F1:F2 に出すとして、F1 に次の式を入れます。

=MMULT(A1:B2, D1:D2)

結果は 2×1 の列ベクトルとしてスピルします。
中身は
w1 = a11×v1 + a12×v2
w2 = a21×v1 + a22×v2
という計算です。

行ベクトル×行列

逆に、1×2 行ベクトル u と 2×2 行列 A の積 u×A(1×2 行ベクトル)も同様に書けます。

u を A4:B4、行列 A を A1:B2 とすると、
結果を D4:E4 に出したい場合、D4 に次の式を入れます。

=MMULT(A4:B4, A1:B2)

結果は 1×2 の行ベクトルとしてスピルします。


MMULT を使うときの注意点

次元(サイズ)が合わないとエラー

array1 の列数と array2 の行数が一致していないと、MMULT は #VALUE! エラーになります。
例えば、2×3 行列と 2×2 行列を掛けようとすると、次元が合わないのでエラーです。

結果のサイズを意識する

結果の行列サイズは「array1 の行数 × array2 の列数」です。
動的配列対応版なら自動スピルですが、古い Excel では、あらかじめそのサイズ分のセル範囲を選択してから配列数式として確定する必要があります。


例題

問題1

A1:B2 に次の行列 A、D1:E2 に行列 B が入っています。

A1:1 B1:2
A2:3 B2:4

D1:5 E1:6
D2:7 E2:8

この 2 つの行列の積 C = A×B を MMULT で求める式を書いてください。
また、結果の行列のサイズ(行数×列数)がどうなるかも答えてください。

問題2

A1:C2 に 2×3 行列、D1:E3 に 3×2 行列が入っています。
この 2 つの行列の積を MMULT で求める式を書いてください。
さらに、結果の行列のサイズ(何行×何列)になるかを説明してください。

問題3

A1:B2 に 2×2 行列 A、D1:D2 に 2×1 ベクトル v が入っています。
ベクトル w = A×v を MMULT で求める式を書いてください。
結果は何行×何列の配列になるかも答えてください。

問題4

次の式が #VALUE! エラーになりました。

=MMULT(A1:B3, D1:E2)

このとき、A1:B3 は 3×2 行列、D1:E2 は 2×2 行列です。
なぜエラーになるのか、「行列の積の次元条件」という観点から説明してください。

問題5

MMULT を使わずに、2×2 行列同士の積を通常の四則演算だけで書くとどうなるか、
A1:B2 と D1:E2 の行列積を例に、C11, C12, C21, C22 をそれぞれどのような式で表すか書いてみてください。
そのうえで、「MMULT を使うと何が楽になるか」を自分の言葉で説明してみてください。

タイトルとURLをコピーしました