矩阵相乘的实现方法

矩阵相乘问题作为一个工作中科研中常用的简单计算问题,在处理大批量数据任务中显得尤为重要。目前不论是基于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

最后给大家强推一个深度学习的资源,有大量机器学习源代码,基于pytorch的,tensorflow的,keras的等等:https://morvanzhou.github.io/

书籍的话推荐:
1、深度学习入门 基于python的理论与实现,斋藤康毅(日),中国工信出版社
2、深度学习框架pytorch入门与实践,陈云,中国工信出版社(里面有好多项目实战源代码)

谢谢,欢迎交流!

猜你喜欢

转载自blog.csdn.net/weixin_46047216/article/details/106311129