
2.3 矩阵乘法:最重要的线性代数运算规则
矩阵乘法是最重要线性代数运算,没有之一——这句话并不夸张。
矩阵乘法规则可以视作算术“九九乘法表”的进阶版。
矩阵乘法规则
A和B两个矩阵相乘的前提是矩阵A的列数和矩阵B的行数相同。A和B的乘积一般写作AB。
A和B两个矩阵相乘AB读作“matrix boldface capital A times matrix boldface capital B”或“the matrix product boldf ace capital A and boldface capital B”。
NumPy中,两个矩阵相乘的运算符为@,鸢尾花书一部分矩阵乘法也会采用@。比如,AB也记做A@B:
注意:A在左边,B在右边,不能随意改变顺序。也就是说,矩阵乘法一般情况下不满足交换律,即AB≠BA。

如图2.7所示,矩阵A的形状为m行、p列,矩阵B的形状为p行、n列。A和B相乘得到矩阵C,C的形状为m行、n列,相当于消去了p。

图2.7 矩阵乘法规则
再次强调,矩阵乘法不满足交换律。也就是说,一般情况下下式不成立,即

首先,B的列数和A的行数很可能不匹配。即便m=n,也就是B的列数等于A的行数,BA结果也很可能不等于AB。
两个2×2矩阵相乘
下面,用两个2×2矩阵相乘讲解矩阵乘法运算规则。
设矩阵A和B相乘结果为矩阵C,有

图2.8所示为两个2×2矩阵相乘如何得到矩阵C的每一个元素。
矩阵A的第一行元素和矩阵B第一列对应元素分别相乘,再相加,结果为矩阵C的第一行、第一列元素c1,1。
矩阵A的第一行元素和矩阵B第二列对应元素分别相乘,再相加,得到c1,2。

图2.8 矩阵乘法规则,两个2×2矩阵相乘为例
同理,依次获得矩阵C的c2,1和c2,2两个元素。
总结来说,A和B乘积C的第i行第j列的元素ci,j等于矩阵A的第i行的元素与矩阵B的第j列对应元素乘积再求和。
注意:这个矩阵运算规则既是一种发明创造,也是一种约定成俗。也就是说,这种乘法规则在被法国数学家雅克·菲利普·玛丽·比内(Jacques Philippe Marie Binet, 1786—1856)提出之后,在长期的数学实践中被广为接受。矩阵乘法可谓“成人版九九乘法表”。就像大家儿时背诵九九乘法表时一样,这里建议大家先把矩阵乘法规则背下来,熟能生巧,慢慢地大家就会通过不断学习认识到这个乘法规则的精妙之处。
Bk3_Ch2_09.py展示如何完成矩阵乘法运算。
矩阵乘法形态
图2.9所示给出了常见的多种矩阵乘法形态,每一种形态对应一类线性代数问题。图2.9中特别高亮显示出矩阵乘法中左侧矩阵的“列”和右侧矩阵的“行”。高亮的“维度”在矩阵乘法中被“消去”。鸢尾花书《矩阵力量》一册将会详细介绍图2.9每一种乘法形态。
这里特别提醒大家,初学者对矩阵乘法会产生一种错误印象,认为这些千奇百怪的矩阵乘法形态就是“奇技淫巧”。这是极其错误的想法!在不断学习中,大家会逐渐领略到每种矩阵乘法形态的力量所在。

图2.9 矩阵乘法形态多样性
两个向量相乘
本节最后着重讲一下图2.9最上面两种向量的乘积。这两种特殊形态的矩阵乘法正是理解矩阵乘法规则的两个重要视角。
向量a和b为等长列向量,a转置(aT)乘b为标量,等价于a和b的标量积,即

举个例子:

列向量a乘b转置(bT),乘积结果abT为方阵,也就是行数和列数相同的矩阵,即

如果a和b分别为不等长列向量,请大家自行计算abT的结果:

再次强调:使用numpy.array()构造向量时,np.array([1,2])构造的是一维数组,不能算是矩阵。而np.array([[1,2]])构造得到的相当于1×2行向量,是一个特殊矩阵。注意,《编程不难》专门区分数组、向量、矩阵等概念。
np.array([[1],[2]])构造的是一个2×1列向量,也是个矩阵。鸢尾花书会在《矩阵力量》一册介绍更多构造行向量和列向量的方法。