Python.numpy.矩阵乘法运算
声明:本文章转载于矩阵的乘法运算及Python实现
在讲矩阵相乘之前,我们先看一个生活中的例子。 假如猪肉、牛肉、鸡蛋的价格在一周内不发生变化,记录近三周内的价格。为计算简单起见,价格都设定为整数。
设某个家庭每周对猪肉、牛肉、鸡蛋的需求分别为4千克、3千克、2千克,求这个家庭近三周对上述三种食品的需求开支?
一般计算过程为:
第一周:15 X 4 + 28 X 3 + 5 X 2 = 154
第二周:12 X 4 + 31 X 3 + 6 X 2 = 153
第三周:13 X 4 + 29 X 3 + 7 X 2 = 153
现在我们把上面的数据用矩阵来表示,矩阵A表示猪肉、牛肉、鸡蛋三周的价格,矩阵B表示某个家庭每周的需求。
矩阵A X B的结果是什么呢?
矩阵A的第1、2、3行分别表示第一周、第二周、第三周,矩阵A的第1、2、3列分别表示猪肉、牛肉、鸡蛋每周的价格,和上面的表格数据是一致的。矩阵B是3行1列的矩阵,也称为列向量,后面的课程会讲到向量,矩阵B的第1、2、3行分别表示某家庭每周猪肉、牛肉、鸡蛋的需求量。
要使矩阵A乘以矩阵B的结果符合我们的问题需求,其结果应该是一个3X1矩阵C,其中C矩阵第1行第1列元素是A矩阵第1行的每列元素与B矩阵第1列的每行元素的乘积和;C矩阵的第2行第1列元素是A矩阵第2行的每列元素与B矩阵第1列的每行元素的乘积和;C矩阵的第3行第1列元素是A矩阵第3行的每列元素与B矩阵第1列的每行元素的乘积和。
下面我们给出两个矩阵的乘法规则: 设A是一个m X n矩阵,B是一个 n X p矩阵,则A与B的乘积是一个m X p矩阵,这个矩阵的第i行第j列的元素Cij等于A矩阵的第i行元素与B矩阵的第j列对应元素的乘积和,即:
注意:
A矩阵和B矩阵可以相乘的条件是:A矩阵的列数等于B矩阵的行数。矩阵的乘法不满足交互律,即A X B != B X A。
矩阵最早来自于方程组的系数及常数所构成的方阵。因此矩阵的乘法规则是为了满足使用矩阵解线性方程组的要求而设定的。
在前面的案例中,我们设某家庭近三周每周对猪肉、牛肉、鸡蛋的需求分别为x千克、y千克、z千克,已知近三周每周猪肉、牛肉、鸡蛋的价格和某家庭近三周每周的消费,求x、y和z。
可以列三元一次方程组:
15x + 28y + 5z = 154
12x + 31y + 6z = 153
13x + 29y + 7z = 153
用消元法我们可以求得x = 4,y=3,z=2。
我们也可以把上面方程组的系数、未知数、常数用矩阵的方式来表示,这样就可以使用矩阵运算来求解方程组。
求解三元一次方程组的问题就变为: 已知A矩阵,已知A矩阵和B矩阵的乘积C矩阵,求B矩阵的问题。如何求B矩阵,在后面的解线性方程组课程会讨论。
对上面的矩阵,如果再写回三元一次方程组的形式,可以按照矩阵的乘法规则来写:
15x + 28y + 5z = 154
12x + 31y + 6z = 153
13x + 29y + 7z = 153
下面我们使用Python语言来实现A矩阵与B矩阵的乘法运算。
#定义矩阵A和BA = [[15,28,5],[12,31,6],[13,29,7]]B = [[4],[3],[2]]#定义矩阵乘法运算函数def matrixMul(A, B):#创建矩阵C,矩阵C的默认元素都为0#矩阵C的行数为A矩阵的行数,列数为B矩阵的列数C = [[0] * len(B[0]) for i in range(len(A))]#按行遍历A矩阵for i in range(len(A)):#按列遍历B矩阵for j in range(len(B[0])):#C矩阵的第i行第j列所对应的数值#等于A矩阵的第i行分别乘以B矩阵的第j列之和for k in range(len(B)):C[i][j] += A[i][k] * B[k][j]return Cif __name__ == '__main__':C = matrixMul(A,B)print(C)
下面我们使用NumPy库来实现A与B矩阵的乘法运算。
import numpy as np#定义矩阵A和BA = np.array([[15,28,5],[12,31,6],[13,29,7]])B = np.array([[4],[3],[2]])#定义矩阵乘法运算函数def matrixMul(A, B):#NumPy的matmul完成矩阵乘法运算C = np.matmul(A,B)return Cif __name__ == '__main__':C = matrixMul(A,B)print(C)