Python实现矩阵相乘的三种方法小结


Posted in Python onJuly 26, 2018

问题描述

分别实现矩阵相乘的3种算法,比较三种算法在矩阵大小分别为22∗2222∗22, 23∗2323∗23, 24∗2424∗24, 25∗2525∗25, 26∗2626∗26, 27∗2727∗27, 28∗2828∗28, 29∗2929∗29时的运行时间与MATLAB自带的矩阵相乘的运行时间,绘制时间对比图。

解题方法

本文采用了以下方法进行求值:矩阵计算法、定义法、分治法和Strassen方法。这里我们使用Matlab以及Python对这个问题进行处理,比较两种语言在一样的条件下,运算速度的差别。

编程语言

Python

具体代码

#-*- coding: utf-8 -*-
from matplotlib.font_manager import FontProperties
import numpy as np
import time
import random
import math
import copy
import matplotlib.pyplot as plt

#n = [2**2, 2**3, 2**4, 2**5, 2**6, 2**7, 2**8, 2**9, 2**10, 2**11, 2**12]
n = [2**2, 2**3, 2**4, 2**5, 2**6, 2**7, 2**8, 2**9, 2**10, 2**11]
Sum_time1 = []
Sum_time2 = []
Sum_time3 = []
Sum_time4 = []
for m in n:
 A = np.random.randint(0, 2, [m, m])
 B = np.random.randint(0, 2, [m, m])
 A1 = np.mat(A)
 B1 = np.mat(B)
 time_start = time.time()
 C1 = A1*B1
 time_end = time.time()
 Sum_time1.append(time_end - time_start)

 C2 = np.zeros([m, m], dtype = np.int)
 time_start = time.time()
 for i in range(m):
  for k in range(m):
   for j in range(m):
    C2[i, j] = C2[i, j] + A[i, k] * B[k, j]
 time_end = time.time()
 Sum_time2.append(time_end - time_start)
 A11 = np.mat(A[0:m//2, 0:m//2])
 A12 = np.mat(A[0:m//2, m//2:m])
 A21 = np.mat(A[m//2:m, 0:m//2])
 A22 = np.mat(A[m//2:m, m//2:m])
 B11 = np.mat(B[0:m//2, 0:m//2])
 B12 = np.mat(B[0:m//2, m//2:m])
 B21 = np.mat(B[m//2:m, 0:m//2])
 B22 = np.mat(B[m//2:m, m//2:m])
 time_start = time.time()
 C11 = A11 * B11 + A12 * B21
 C12 = A11 * B12 + A12 * B22
 C21 = A21 * B11 + A22 * B21
 C22 = A21 * B12 + A22 * B22
 C3 = np.vstack((np.hstack((C11, C12)), np.hstack((C21, C22))))
 time_end = time.time()
 Sum_time3.append(time_end - time_start)
 time_start = time.time()
 M1 = A11 * (B12 - B22)
 M2 = (A11 + A12) * B22
 M3 = (A21 + A22) * B11
 M4 = A22 * (B21 - B11)
 M5 = (A11 + A22) * (B11 + B22)
 M6 = (A12 - A22) * (B21 + B22)
 M7 = (A11 - A21) * (B11 + B12)
 C11 = M5 + M4 - M2 + M6
 C12 = M1 + M2
 C21 = M3 + M4
 C22 = M5 + M1 - M3 - M7
 C4 = np.vstack((np.hstack((C11, C12)), np.hstack((C21, C22))))
 time_end = time.time()
 Sum_time4.append(time_end - time_start)

f1 = open('python_time1.txt', 'w')
for ele in Sum_time1:
 f1.writelines(str(ele) + '\n')
f1.close()

f2 = open('python_time2.txt', 'w')
for ele in Sum_time2:
 f2.writelines(str(ele) + '\n')
f2.close()

f3 = open('python_time3.txt', 'w')
for ele in Sum_time3:
 f3.writelines(str(ele) + '\n')
f3.close()

f4 = open('python_time4.txt', 'w')
for ele in Sum_time4:
 f4.writelines(str(ele) + '\n')
f4.close()

font = FontProperties(fname=r"c:\windows\fonts\simsun.ttc", size=8)
plt.figure(1)
plt.subplot(221)
plt.semilogx(n, Sum_time1, 'r-*')
plt.ylabel(u"时间(s)", fontproperties=font)
plt.xlabel(u"矩阵的维度n", fontproperties=font)
plt.title(u'python自带的方法', fontproperties=font)
plt.subplot(222)
plt.semilogx(n, Sum_time2, 'b-*')
plt.ylabel(u"时间(s)", fontproperties=font)
plt.xlabel(u"矩阵的维度n", fontproperties=font)
plt.title(u'定义法', fontproperties=font)
plt.subplot(223)
plt.semilogx(n, Sum_time3, 'y-*')
plt.ylabel(u"时间(s)", fontproperties=font)
plt.xlabel(u"矩阵的维度n", fontproperties=font)
plt.title( u'分治法', fontproperties=font)
plt.subplot(224)
plt.semilogx(n, Sum_time4, 'g-*')
plt.ylabel(u"时间(s)", fontproperties=font)
plt.xlabel(u"矩阵的维度n", fontproperties=font)
plt.title( u'Strasses法', fontproperties=font)
plt.figure(2)
plt.semilogx(n, Sum_time1, 'r-*', n, Sum_time2, 'b-+', n, Sum_time3, 'y-o', n, Sum_time4, 'g-^')
#plt.legend(u'python自带的方法', u'定义法', u'分治法', u'Strasses法', fontproperties=font)
plt.show()

以上这篇Python实现矩阵相乘的三种方法小结就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
linux系统使用python监测系统负载脚本分享
Jan 15 Python
自己使用总结Python程序代码片段
Jun 02 Python
基于python的七种经典排序算法(推荐)
Dec 08 Python
不管你的Python报什么错,用这个模块就能正常运行
Sep 14 Python
Python3爬虫学习入门教程
Dec 11 Python
基于python plotly交互式图表大全
Dec 07 Python
Python partial函数原理及用法解析
Dec 11 Python
Python 面向对象部分知识点小结
Mar 09 Python
关于Python turtle库使用时坐标的确定方法
Mar 19 Python
解决django xadmin主题不显示和只显示bootstrap2的问题
Mar 30 Python
TensorFlow使用Graph的基本操作的实现
Apr 22 Python
Python 快速验证代理IP是否有效的方法实现
Jul 15 Python
python实现泊松图像融合
Jul 26 #Python
python中的decorator的作用详解
Jul 26 #Python
python opencv实现旋转矩形框裁减功能
Jul 25 #Python
Python3匿名函数用法示例
Jul 25 #Python
Python实现动态添加属性和方法操作示例
Jul 25 #Python
利用pandas读取中文数据集的方法
Jul 25 #Python
利用pandas进行大文件计数处理的方法
Jul 25 #Python
You might like
JS实现php的伪分页
2008/05/25 PHP
php 静态变量的初始化
2009/11/15 PHP
支持数组的ADDSLASHES的php函数
2010/02/16 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(三)
2014/06/23 PHP
基于Laravel 5.2 regex验证的正确写法
2019/09/29 PHP
禁止你的左键复制实用技巧
2013/01/04 Javascript
Extjs4 Treegrid 使用心得分享(经验篇)
2013/07/01 Javascript
jquery实现动态菜单的实例代码
2013/11/28 Javascript
JavaScript自定义数组排序方法
2015/02/12 Javascript
原生JS实现LOADING效果
2015/03/16 Javascript
JavaScript使用concat连接数组的方法
2015/04/06 Javascript
js中for in语句的用法讲解
2015/04/24 Javascript
详解JavaScript基本类型和引用类型
2015/12/09 Javascript
JavaScript中${pageContext.request.contextPath}取值问题及解决方案
2016/12/08 Javascript
微信小程序 Buffer缓冲区的详解
2017/07/06 Javascript
解决vue项目中type=”file“ change事件只执行一次的问题
2018/05/16 Javascript
微信小程序实现自上而下字幕滚动
2018/07/14 Javascript
JS常见构造模式实例对比分析
2018/08/27 Javascript
springboot+vue+对接支付宝接口+二维码扫描支付功能(沙箱环境)
2020/10/15 Javascript
python下载文件时显示下载进度的方法
2015/04/02 Python
python中dir函数用法分析
2015/04/17 Python
以视频爬取实例讲解Python爬虫神器Beautiful Soup用法
2016/01/20 Python
利用信号如何监控Django模型对象字段值的变化详解
2017/11/27 Python
Python绘制七段数码管实例代码
2017/12/20 Python
python 删除字符串中连续多个空格并保留一个的方法
2018/12/22 Python
react+django清除浏览器缓存的几种方法小结
2019/07/17 Python
Html5之自定义属性(data-,dataset)
2019/11/19 HTML / CSS
Tech21美国/加拿大:英国NO.1防摔保护壳品牌
2018/01/20 全球购物
Lookfantastic意大利官网:英国知名美妆购物网站
2019/05/31 全球购物
char型变量中能不能存贮一个中文汉字
2015/07/08 面试题
模具专业毕业推荐信
2014/03/08 职场文书
企业法人代表任命书
2014/06/06 职场文书
计算机系统管理员求职信
2014/06/20 职场文书
《我和小伙伴》教学反思
2016/02/20 职场文书
Java中Dijkstra(迪杰斯特拉)算法
2022/05/20 Java/Android
基于redis+lua进行限流的方法
2022/07/23 Redis