矩阵相乘

數學中，**矩陣乘法**（英語：matrix multiplication）是一種根據兩個矩陣得到第三個矩陣的二元運算，第三個矩陣即前兩者的乘積，稱為**矩陣積**（英語：matrix product）。設 $A$ 是 $n\times m$ 的矩陣， $B$ 是 $m\times p$ 的矩陣，則它們的矩陣積 $AB$ 是 $n\times p$ 的矩陣。 $A$ 中每一行的 $m$ 個元素都與 $B$ 中對應列的 $m$ 個元素對應相乘，這些乘積的和就是 $AB$ 中的一個元素。

矩陣可以用來表示線性映射，矩陣積則可以用來表示線性映射的複合。因此，矩陣乘法是線性代數的基礎工具，不僅在數學中有大量應用，在應用數學、物理學、工程學等領域也有廣泛使用。

## 一般矩陣乘積

矩陣相乘最重要的方法是一般矩陣乘積。它只有在第一個矩陣的**行數**（column，中國大陸作**列數**）和第二個矩陣的**列數**（row，中國大陸作**行數**）相同時才有定義。一般單指矩陣乘積時，指的便是一般矩陣乘積。若 $A$ 為 $m\times n$ 矩陣， _$B$_ 為 $n\times p$ 矩陣，則他們的**乘積** _$AB$_ (有時記做 $A\cdot B$ ）會是一個 $m\times p$ 矩陣。其乘積動差陣的元素如下面式子得出：

　
: $(AB)_{ij}=\sum _{r=1}^{n}a_{ir}b_{rj}=a_{i1}b_{1j}+a_{i2}b_{2j}+\cdots +a_{in}b_{nj}$

以上是用矩陣單元的代數系統來說明這類乘法的抽象性質。本節以下各種運算法都是這個公式的不同角度理解，運算結果相等：

### 由定義直接計算

左邊的圖表示出要如何計算 _$AB$_ 的 $(1,2)$ 和 $(3,3)$ 元素，當 _$A$_ 是個 $4\times 2$ 矩陣和 _B_ 是個 $2\times 3$ 矩陣時。分別來自兩個矩陣的元素都依箭頭方向而兩兩配對，把每一對中的兩個元素相乘，再把這些乘積加總起來，最後得到的值即為箭頭相交位置的值。

　
: $(AB)_{1,2}=\sum _{r=1}^{2}a_{1,r}b_{r,2}=a_{1,1}b_{1,2}+a_{1,2}b_{2,2}$

　
: $(AB)_{3,3}=\sum _{r=1}^{2}a_{3,r}b_{r,3}=a_{3,1}b_{1,3}+a_{3,2}b_{2,3}$

### 向量方法

這種矩陣乘積亦可由稍微不同的觀點來思考：把向量和各係數相乘後相加起來。設 _**$\mathbf {A} $**_ 和 _**$\mathbf {B} $**_ 是兩個給定如下的矩陣：

　
: $\mathbf {A} ={\begin{bmatrix}a_{1,1}&a_{1,2}&\dots \\a_{2,1}&a_{2,2}&\dots \\\vdots &\vdots &\ddots \end{bmatrix}}={\begin{bmatrix}A_{1}&A_{2}&\dots \end{bmatrix}},$ $\mathbf {B} ={\begin{bmatrix}b_{1,1}&b_{1,2}&\dots \\b_{2,1}&b_{2,2}&\dots \\\vdots &\vdots &\ddots \end{bmatrix}}={\begin{bmatrix}B_{1}\\B_{2}\\\vdots \end{bmatrix}}$

其中

　
: $A_{1}$ 是由所有 $a_{x,1}$ 元素所組成的向量 (column)， $A_{2}$ 是由所有 $a_{x,2}$ 元素所組成的向量，以此類推。

　
: $B_{1}$ 是由所有 $b_{1,x}$ 元素所組成的向量 (row)， $B_{2}$ 是由所有 $b_{2,x}$ 元素所組成的向量，以此類推。

則

　
: $\mathbf {AB} ={\begin{bmatrix}a_{1,1}{\begin{bmatrix}b_{1,1}&b_{1,2}&\dots \end{bmatrix}}+a_{1,2}{\begin{bmatrix}b_{2,1}&b_{2,2}&\dots \end{bmatrix}}+\cdots \\\\a_{2,1}{\begin{bmatrix}b_{1,1}&b_{1,2}&\dots \end{bmatrix}}+a_{2,2}{\begin{bmatrix}b_{2,1}&b_{2,2}&\dots \end{bmatrix}}+\cdots \\\vdots \end{bmatrix}}=A_{1}B_{1}+A_{2}B_{2}+\dots $

舉個例子來說：

　
: ${\begin{bmatrix}1&0&2\\-1&3&1\end{bmatrix}}\cdot {\begin{bmatrix}3&1\\2&1\\1&0\end{bmatrix}}={\begin{bmatrix}1{\begin{bmatrix}3&1\end{bmatrix}}+0{\begin{bmatrix}2&1\end{bmatrix}}+2{\begin{bmatrix}1&0\end{bmatrix}}\\-1{\begin{bmatrix}3&1\end{bmatrix}}+3{\begin{bmatrix}2&1\end{bmatrix}}+1{\begin{bmatrix}1&0\end{bmatrix}}\end{bmatrix}}={\begin{bmatrix}{\begin{bmatrix}3&1\end{bmatrix}}+{\begin{bmatrix}0&0\end{bmatrix}}+{\begin{bmatrix}2&0\end{bmatrix}}\\{\begin{bmatrix}-3&-1\end{bmatrix}}+{\begin{bmatrix}6&3\end{bmatrix}}+{\begin{bmatrix}1&0\end{bmatrix}}\end{bmatrix}}$

　
: $={\begin{bmatrix}5&1\\4&2\end{bmatrix}}$

左面矩陣的列為為係數表，右邊矩陣為向量表。例如，第一行是 [1 0 2]，因此將 1 乘上第一個向量，0 乘上第二個向量，2 則乘上第三個向量。

### 向量表方法

一般矩陣乘積也可以想為是行向量和列向量的內積。若 _**$\mathbf {A} $**_ 和 _**$\mathbf {B} $**_ 為給定如下的矩陣：

　
: $\mathbf {A} ={\begin{bmatrix}a_{1,1}&a_{1,2}&a_{1,3}&\dots \\a_{2,1}&a_{2,2}&a_{2,3}&\dots \\a_{3,1}&a_{3,2}&a_{3,3}&\dots \\\vdots &\vdots &\vdots &\ddots \end{bmatrix}}={\begin{bmatrix}A_{1}\\A_{2}\\A_{3}\\\vdots \end{bmatrix}}$ 且 $\mathbf {B} ={\begin{bmatrix}b_{1,1}&b_{1,2}&b_{1,3}&\dots \\b_{2,1}&b_{2,2}&b_{2,3}&\dots \\b_{3,1}&b_{3,2}&b_{3,3}&\dots \\\vdots &\vdots &\vdots &\ddots \end{bmatrix}}={\begin{bmatrix}B_{1}&B_{2}&B_{3}&\dots \end{bmatrix}}$

其中，這裡

　
: $A_{1}$ 是由所有 $a_{1,x}$ 元素所組成的向量， $A_{2}$ 是由所有 $a_{2,x}$ 元素所組成的向量，以此類推。

　
: $B_{1}$ 是由所有 $b_{x,1}$ 元素所組成的向量， $B_{2}$ 是由所有 $b_{x,2}$ 元素所組成的向量，以此類推。

則

　
: $\mathbf {AB} ={\begin{bmatrix}A_{1}\\A_{2}\\A_{3}\\\vdots \end{bmatrix}}\times {\begin{bmatrix}B_{1}&B_{2}&B_{3}&\dots \end{bmatrix}}={\begin{bmatrix}(A_{1}\cdot B_{1})&(A_{1}\cdot B_{2})&(A_{1}\cdot B_{3})&\dots \\(A_{2}\cdot B_{1})&(A_{2}\cdot B_{2})&(A_{2}\cdot B_{3})&\dots \\(A_{3}\cdot B_{1})&(A_{3}\cdot B_{2})&(A_{3}\cdot B_{3})&\dots \\\vdots &\vdots &\vdots &\ddots \end{bmatrix}}$

即

　
: $\left(\mathbf {AB} \right)_{ij}=A_{i}B_{j}$

### 性質

矩陣乘法是不可交換的（即 $AB\neq BA$ ），除了一些較特別的情況。很清楚可以知道，不可能預期說在改變向量的部份後還能得到相同的結果，而且第一個矩陣的列數必須要和第二個矩陣的行數相同，也可以看出為什麼矩陣相乘的順序會影響其結果。

雖然矩陣乘法是不可交換的，但 _$AB$_ 和 _$BA$_ 的行列式總會是一樣的（當 _$A$_ 、 _$B$_ 是同樣大小的方陣時）。其解釋在**行列式**條目內。

當 _$A$_ 、 _$B$_ 可以被解釋為線性算子，其矩陣乘積 _$AB$_ 會對應為兩個線性算子的複合函數，其中 _B_ 先作用。

### 在試算表中做矩陣乘法

$$
{\begin{bmatrix}1&0&2\\-1&3&1\end{bmatrix}}\cdot {\begin{bmatrix}3&1\\2&1\\1&0\end{bmatrix}}={\begin{bmatrix}5&1\\4&2\end{bmatrix}}
$$

以 Google Sheet 為例，選取儲存格範圍或者使用陣列，在儲存格輸入

在某些試算表軟體中必須必須按 `Ctrl`+`⇧ Shift`+`↵ Enter` 將儲存格內的變數轉換為陣列

## 純量乘積

矩陣 _$A=(a_{ij})$_ 和純量 $r$ 的純量乘積 _$rA$_ 的矩陣大小和 _$A$_ 一樣， _$rA$_ 的各元素定義如下：

　
: $(rA)_{ij}=r\cdot a_{ij}\ $

若我們考慮於一個環的矩陣時，上述的乘積有時會稱做_左乘積_，而_右乘積_的則定義為

　
: $(Ar)_{ij}=a_{ij}\cdot r\ $

當環是可交換時，例如實數體或複數體，這兩個乘積是相同的。但無論如何，若環是不可交換的話，如四元數，他們可能會是不同的。例如，

　
: $i{\begin{bmatrix}i&0\\0&j\\\end{bmatrix}}={\begin{bmatrix}-1&0\\0&k\\\end{bmatrix}}\neq {\begin{bmatrix}-1&0\\0&-k\\\end{bmatrix}}={\begin{bmatrix}i&0\\0&j\\\end{bmatrix}}i$

## 阿達馬乘積

給定兩個相同維度的矩陣可計算有**阿達馬乘積**（Hadamard product），或稱做**逐項乘積**、**分素乘積**（**element-wise product**, **entrywise product**）。兩個 _$m\times n$_ 矩陣 $A$ 、 _$B$_ 的阿達馬乘積標記為 $A\circ B$ ，定義為 $(A\circ B)_{ij}=a_{ij}b_{ij}$ 的 _$m\times n$_ 矩陣。例如，

　
: ${\begin{bmatrix}1&3&2\\1&0&0\\1&2&2\end{bmatrix}}\circ {\begin{bmatrix}0&0&2\\7&5&0\\2&1&1\end{bmatrix}}={\begin{bmatrix}1\cdot 0&3\cdot 0&2\cdot 2\\1\cdot 7&0\cdot 5&0\cdot 0\\1\cdot 2&2\cdot 1&2\cdot 1\end{bmatrix}}={\begin{bmatrix}0&0&4\\7&0&0\\2&2&2\end{bmatrix}}$

需注意的是，阿達馬乘積是克羅內克乘積的子矩陣。

## 克羅內克乘積

給定任兩個矩陣 $A$ 和 $B$ ，可以得到兩個矩陣的直積，或稱為克羅內克乘積 $A\otimes B$ ，其定義如下

　
: ${\begin{bmatrix}a_{11}B&a_{12}B&\cdots &a_{1n}B\\\vdots &\vdots &\ddots &\vdots \\a_{m1}B&a_{m2}B&\cdots &a_{mn}B\end{bmatrix}}$

當 $A$ 是一 $m\times n$ 矩陣和 $B$ 是一 $p\times r$ 矩陣時， $A\otimes B$ 會是一 $mp\times nr$ 矩陣，而且此一乘積也是不可交換的。

舉個例子，

　
: ${\begin{bmatrix}1&2\\3&1\\\end{bmatrix}}\otimes {\begin{bmatrix}0&3\\2&1\\\end{bmatrix}}={\begin{bmatrix}1\cdot 0&1\cdot 3&2\cdot 0&2\cdot 3\\1\cdot 2&1\cdot 1&2\cdot 2&2\cdot 1\\3\cdot 0&3\cdot 3&1\cdot 0&1\cdot 3\\3\cdot 2&3\cdot 1&1\cdot 2&1\cdot 1\\\end{bmatrix}}={\begin{bmatrix}0&3&0&6\\2&1&4&2\\0&9&0&3\\6&3&2&1\end{bmatrix}}$

若 $A$ 和 $B$ 分別表示兩個線性算子 $V_{1}\to W_{1}$ 和 $V_{2}\to W_{2}$ ， $A\otimes B$ 便為其映射的張量乘積， $V_{1}\otimes V_{2}\to W_{1}\otimes W_{2}$

## 共同性質

上述三種乘積都符合結合律：

　
: $A(BC)=(AB)C$

以及分配律：

　
: $A(B+C)=AB+AC$

　
: $(A+B)C=AC+BC$

而且和純量乘積相容：

　
: $c(AB)=(cA)B$

　
: $(Ac)B=A(cB)$

　
: $(AB)c=A(Bc)$

注意上述三個分開的表示式只有在純量體的乘法及加法是可交換（即純量體為一可交換環）時會相同。

## 另見

* Strassen 演算法（1969）
* Winograd 演算法（1980）
* Coppersmith–Winograd 演算法（1990）
* 邏輯矩陣
* 矩陣鏈乘積
* 逆矩陣
* 關係複合
* BLAS
* 矩陣加法
* 矩陣微積分

## 外部連結

* WIMS Online Matrix Multiplier （頁面存檔備份，存於網際網路檔案館）
* Animated Matrix Multiplication Examples (purplemath) （頁面存檔備份，存於網際網路檔案館）
* Matrix Multipication in Javascript （頁面存檔備份，存於網際網路檔案館）（works in Firefox）

## 參考

其它參考文獻包括：

* Strassen, Volker, _Gaussian Elimination is not Optimal_, Numer. Math. 13, p. 354-356, 1969.
* Coppersmith, D., Winograd S., _Matrix multiplication via arithmetic progressions_, J. Symbolic Comput. 9, p. 251-280, 1990.
* Horn, Roger; Johnson, Charles: "Topics in Matrix Analysis", Cambridge, 1994.
* Robinson, Sara, _Toward an Optimal Algorithm for Matrix Multiplication,_ SIAM News 38(9), November 2005.