矩阵相乘问题作为一个工作中科研中常用的简单计算问题,在处理大批量数据任务中显得尤为重要。目前不论是基于pytorch还是tensorflow的深度学习框架,数据的表示基础就是tensor,也就是张量,二阶张量中就包含着矩阵;众所周知,矩阵乘法:矩阵相乘最重要的方法是一般矩阵乘积。本文章内容也只谈论一般矩阵乘积。它只有在第一个矩阵的列数(column)和第二个矩阵的行数(row)相同时才有意义。本文依然采用二维列表来表示矩阵。由于基于python中有许多辅助库如pandas和自带的numpy都可以很便捷的实现矩阵相乘,而本文不使用这些库来实现矩阵相乘。
例如实现矩阵A(25)和矩阵B(52)的乘积:
A:
1 2 3 4 5
6 7 8 9 0
B:
1 2
3 4
5 6
7 8
9 0
思路:
1、首先要将矩阵数据列表化,那么有:
ls_A = [[1,2,3,4,5],[6,7,8,9,0]]
ls_B = [[1,2],[3,4],[5,6],[7,8],[9,0]]
2、然后将矩阵B做转置变换,有:
ls_B_r = [[1,3,5,7,9],[2,4,6,8,0]]
3、构造一个2*2尺寸的空矩阵;
4、然后将ls_A中各子列表元素与ls_B_r中的子列表元素作内积运算,运算结果放入空矩阵相应位置中;
5、最后输出结果。
具体实施代码如下:
# -*- coding: utf-8 -*-
"""
Created on Sun May 24 10:50:46 2020
@author: ScramJet
"""
def rotate(ls): #首先定义矩阵的转置函数,实现B矩阵转置是为了乘法运算操作更简便
a, b= len(ls),len(ls[0])
lst = []
for i in range(b):
ls_t = []
for j in range(a):
ls_t.append(ls[j][i])
lst.append(ls_t)
return lst
def scalar_product(ls1,ls2): #定义两个向量的内积运算函数(内积依然用列表表示)
a = len(ls1)
sum = 0
for i in range(a):
sum += ls1[i]*ls2[i]
return sum
def multiple(ls1,ls2):#实现两个矩阵的乘法函数
ls3 = rotate(ls2)
a = len(ls1)
b = len(ls3)
matrix = [[0 for j in range(b)]for i in range(a)] # 构造尺寸为a*b的空矩阵用以存放乘积结果
for i in range(a):#乘法运算
for j in range(b):
matrix[i][j] = str(scalar_product(ls1[i],ls3[j]))#这里把数据转为str形式只是为了输出更方便,如果输出需要以数据的形式输出,可以不加str
return matrix
def printf(matrix):
for k in matrix:
print(' '.join(k))
while True:
try:
a = eval(input())#输入矩阵A的行数
b = eval(input())d#输入矩阵A的列数也是矩阵B的行数
c = eval(input())#输入矩阵B的列数
ls1,ls2 = [],[]
for i in range(a):#输入矩阵A
ls1.append(list(map(eval,input().split())))
for j in range(b):#输入矩阵B
ls2.append(list(map(eval,input().split())))
matrix = multiple(ls1,ls2)
printf(matrix)
break
except:
break
```python
最后附上测试代码:
#输入
2
5
2
1 2 3 4 5
6 7 8 9 0
1 2
3 4
5 6
7 8
9 0
#输出
95 60
130 160
#输入
2
3
5
1 2 3
4 5 6
1 2 3 4 5
6 7 8 9 0
1 2 3 4 5
#输出
16 22 28 34 20
40 55 70 85 50
谢谢,欢迎交流!