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进程通信之匿名管道实例讲解
Apr 11 Python
python 线程的暂停, 恢复, 退出详解及实例
Dec 06 Python
Python 将pdf转成图片的方法
Apr 23 Python
python微信公众号之关键词自动回复
Jun 15 Python
深入浅析Python中list的复制及深拷贝与浅拷贝
Sep 03 Python
Python3.6.2调用ffmpeg的方法
Jan 10 Python
深入理解Django-Signals信号量
Feb 19 Python
Python实现的插入排序,冒泡排序,快速排序,选择排序算法示例
May 04 Python
python 引用传递和值传递详解(实参,形参)
Jun 05 Python
golang/python实现归并排序实例代码
Aug 30 Python
python re.match()用法相关示例
Jan 27 Python
python文件与路径操作神器 pathlib
Apr 01 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
咖啡常见的种类
2021/03/03 新手入门
用PHP动态创建Flash动画
2006/10/09 PHP
ThinkPHP实现事务回滚示例代码
2014/06/23 PHP
PHP几个实用自定义函数小结
2016/01/25 PHP
老生常谈PHP位运算的用途
2017/03/12 PHP
php连接mysql数据库
2017/03/21 PHP
JS 的应用开发初探(mootools)
2009/12/19 Javascript
jquery常用技巧及常用方法列表集合
2011/04/06 Javascript
使用Mootools动态添加Css样式表代码,兼容各浏览器
2011/12/12 Javascript
JavaScript从数组中删除指定值元素的方法
2015/03/18 Javascript
jquery模拟alert的弹窗插件
2015/07/31 Javascript
高性能JavaScript 重排与重绘(2)
2015/08/11 Javascript
详解JavaScript中this关键字的用法
2016/05/26 Javascript
Bootstrap Table使用方法解析
2016/10/19 Javascript
jquery操作ID带有变量的节点实例
2016/12/07 Javascript
NodeJS如何实现同步的方法示例
2018/08/24 NodeJs
使用vue.js在页面内组件监听scroll事件的方法
2018/09/11 Javascript
jquery使用FormData实现异步上传文件
2018/10/25 jQuery
JavaScript回调函数callback用法解析
2020/01/14 Javascript
vue - props 声明数组和对象操作
2020/07/30 Javascript
antd-日历组件,前后禁止选择,只能选中间一部分的实例
2020/10/29 Javascript
[05:04]完美世界携手游戏风云打造 卡尔工作室地图界面篇
2013/04/23 DOTA
Python字典的基本用法实例分析【创建、增加、获取、修改、删除】
2019/03/05 Python
Python函数的参数常见分类与用法实例详解
2019/03/30 Python
django 类视图的使用方法详解
2019/07/24 Python
Django如何实现上传图片功能
2019/08/16 Python
分享PyCharm的几个使用技巧
2019/11/10 Python
CSS3中文字镂空、透明值、阴影效果设置示例小结
2016/03/07 HTML / CSS
Yahoo-PHP面试题3
2012/01/14 面试题
Linux不知道文件后缀名怎么判断文件类型
2012/04/26 面试题
春季防火方案
2014/05/10 职场文书
啤酒节策划方案
2014/05/28 职场文书
群众路线个人剖析材料及整改措施
2014/11/04 职场文书
2014年财务经理工作总结
2014/12/08 职场文书
祝福语集锦:送给毕业同学祝福语
2019/11/21 职场文书
PyTorch的Debug指南
2021/05/07 Python