1.矩阵乘法的概念
矩阵乘法是线性代数中的一个基本运算,它定义了两个矩阵之间如何相乘。给定两个矩阵 A和 B,如果 A 的列数等于 B 的行数,那么这两个矩阵就可以相乘。结果矩阵 C 的元素 cij 由 A 的第 i行和 B 的第 j列的对应元素的点积(内积)计算得出。
2.方法
在Python中,尤其是使用NumPy库时,矩阵乘法可以通过以下几种方法实现:
(1)x * y
语法: x * y
适用数据类型: NumPy数组
结果类型: NumPy数组
特点: 这是元素级乘法(Hadamard乘法),即对应元素相乘。它不适用于真正的矩阵乘法。如果 x 和 y 是二维数组(矩阵),则 x * y 会返回一个新的数组,其中每个元素是 x 和 y 对应位置元素的乘积。
(2)x @ y
语法: x @ y
适用数据类型: NumPy数组
结果类型: NumPy数组
特点: 这是Python 3.5引入的矩阵乘法运算符,专门用于执行矩阵乘法操作。它支持二维数组(矩阵)和一维数组(向量)之间的乘法,并且可以处理高维数组的广播。
高维数组的广播是指NumPy在进行数组操作时,能够自动将不同形状的数组进行扩展以匹配相同的形状。广播规则如下:
如果两个数组的维度数不相同,那么小维度数组的形状将会在左边补1。
对于每个维度,如果两个数组在该维度上的长度相同,或者其中一个数组在该维度上的长度为1,那么它们就是兼容的。
如果在任何维度上都不满足上述条件,则会引发错误。
广播之后,每个数组的行为就好像它的形状等于两个输入数组的形状的元素最大值。
在一个维度上,如果一个数组的长度为1,另一个数组的长度大于1,那么第一个数组的元素沿着该维度复制以匹配第二个数组的形状。
例如,假设我们有两个二维数组A和B,其中A的形状是(3, 1),B的形状是(1, 4)。根据广播规则,我们可以将A的形状扩展为(3, 4),使得它们可以进行矩阵乘法。具体来说,A的每一行都会与B的每一列相乘,得到一个新的矩阵C,其形状为(3, 4)。
(3)np.matmul(x, y)
语法: np.matmul(x, y)
适用数据类型: NumPy数组
结果类型: NumPy数组
特点: 这是NumPy库中的一个函数,用于执行矩阵乘法。它与 @ 运算符的功能相同,但在多维数组情况下更为灵活,支持广播规则。
(4)x.dot(y)
语法: x.dot(y)
适用数据类型: NumPy数组
结果类型: NumPy数组
特点: 这是NumPy数组的方法之一,用于进行矩阵乘法。它的功能与 np.matmul() 类似,通常用于一维和二维数组的乘法。对于一维数组,x.dot(y) 返回的是内积,而对于二维数组,则返回矩阵乘法的结果。
3.示例
4.输出结果
对于 @ 运算符、np.matmul 函数和 dot 方法,输出结果将是:
对于 * 运算符(Hadamard乘法),输出结果将是:
5.作用
矩阵乘法在许多领域都有广泛的应用,包括:
- 线性代数: 用于解线性方程组。
- 计算机图形学: 用于变换坐标。
- 机器学习: 用于计算权重和特征的组合。
- 物理学: 用于描述状态变化。
6.与线性代数中矩阵乘法的异同
在线性代数中,矩阵乘法遵循以下规则:
(1)维度匹配:要乘的两个矩阵 A 和 B必须满足 A的列数等于 B 的行数。
(2)结果矩阵:结果矩阵 C 的元素 cij 由 A 的第 i 行和 B 的第 j列的对应元素的点积计算得出。
相同点:在Python中,无论是使用 @ 运算符、np.matmul 函数还是 dot 方法,都得到了与手工计算相同的结果。这展示了Python中矩阵乘法的实现与线性代数中的矩阵乘法在数学原理上的一致性。
不同点:在Python中,x * y表示的是元素级别的乘法,即对应位置的元素相乘;而x @ y、np.matmul(x, y)和x.dot(y)则表示的是矩阵乘法,即按照线性代数的规则进行矩阵乘法运算。