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 相关文章推荐
python检测远程端口是否打开的方法
Mar 14 Python
详解Python中DOM方法的动态性
Apr 11 Python
Python实现输出程序执行进度百分比的方法
Sep 16 Python
python基础练习之几个简单的游戏
Nov 10 Python
python实现学生信息管理系统
Apr 05 Python
详解DeBug Python神级工具PySnooper
Jul 03 Python
用python求一重积分和二重积分的例子
Dec 06 Python
Python基础之高级变量类型实例详解
Jan 03 Python
Tensorflow: 从checkpoint文件中读取tensor方式
Feb 10 Python
如何卸载python插件
Jul 08 Python
实例代码讲解Python 线程池
Aug 24 Python
python画图时设置分辨率和画布大小的实现(plt.figure())
Jan 08 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
蝙蝠侠:侠影之谜
2020/03/04 欧美动漫
为了这两部电子管收音机,买了6套全新电子管和10粒刻度盘灯泡
2021/03/02 无线电
linux下为php添加curl扩展的方法
2011/07/29 PHP
PHP读取txt文本文件并分页显示的方法
2015/03/11 PHP
分享3个php获取日历的函数
2015/09/25 PHP
laravel框架实现去掉URL中index.php的方法
2019/10/12 PHP
学习ExtJS Column布局
2009/10/08 Javascript
jquery下将选择的checkbox的id组成字符串的方法
2010/11/28 Javascript
JavaScript中的立即执行函数表达式介绍
2015/03/15 Javascript
实现非常简单的js双向数据绑定
2015/11/06 Javascript
JavaScript中文件上传API详解
2016/04/01 Javascript
AngularJS中scope的绑定策略实例分析
2017/10/30 Javascript
jQuery代码优化方法总结
2018/01/29 jQuery
vue 点击展开显示更多(点击收起部分隐藏)
2019/04/09 Javascript
Vue.js原理分析之nextTick实现详解
2020/09/07 Javascript
[47:39]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 LGD vs OPTIC
2018/03/31 DOTA
[58:00]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Elephant BO3 第二场 2月7日
2021/03/11 DOTA
Python使用scrapy抓取网站sitemap信息的方法
2015/04/08 Python
Python 爬虫多线程详解及实例代码
2016/10/08 Python
python爬虫实现教程转换成 PDF 电子书
2017/02/19 Python
python numpy实现文件存取的示例代码
2019/05/26 Python
利用Python如何实时检测自身内存占用
2020/05/09 Python
python实现b站直播自动发送弹幕功能
2021/02/20 Python
调用HTML5的Canvas API绘制图形的快速入门指南
2016/06/17 HTML / CSS
华丽的手绘陶瓷:MacKenzie-Childs
2017/02/04 全球购物
Raleigh兰令自行车美国官网:英国凤头牌自行车
2018/01/08 全球购物
美国购买肉、鸭、家禽、鹅肝和熟食网站:D’Artagnan
2018/11/13 全球购物
Internal修饰符有什么含义
2013/07/10 面试题
Linux Interview Questions For software testers
2012/06/02 面试题
团日活动策划书
2014/02/01 职场文书
小学教师听课制度
2014/02/01 职场文书
3.15国际消费者权益日主题活动活动总结
2014/03/16 职场文书
2015年纪念“卢沟桥事变”78周年活动方案
2015/05/06 职场文书
2015年学校教研室主任工作总结
2015/07/20 职场文书
2015年第31个教师节致辞
2015/07/31 职场文书
mysql如何能有效防止删库跑路
2021/10/05 MySQL