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实现的Google IP 可用性检测脚本
Apr 23 Python
python获取文件扩展名的方法
Jul 06 Python
Python基于回溯法子集树模板解决0-1背包问题实例
Sep 02 Python
Python实现k-means算法
Feb 23 Python
高效使用Python字典的清单
Apr 04 Python
Python中super函数用法实例分析
Mar 18 Python
python输入错误后删除的方法
Oct 12 Python
基于python实现matlab filter函数过程详解
Jun 08 Python
解决python 执行shell命令无法获取返回值的问题
Dec 05 Python
关于探究python中sys.argv时遇到的问题详解
Feb 23 Python
python保存大型 .mat 数据文件报错超出 IO 限制的操作
May 10 Python
Python中requests做接口测试的方法
May 30 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
解析php中如何直接执行SHELL
2013/06/28 PHP
php实现图片缩放功能类
2013/12/18 PHP
浅谈discuz密码加密的方式
2014/05/22 PHP
php ci 获取表单中多个同名input元素值的代码
2016/03/25 PHP
php文件类型MIME对照表(比较全)
2016/10/07 PHP
thinkphp5 加载静态资源路径与常量的方法
2017/12/24 PHP
图片上传即时显示缩略图的js代码
2009/05/27 Javascript
firefox事件处理之自动查找event的函数(用于onclick=foo())
2010/08/05 Javascript
jQuery学习笔记之jQuery动画效果
2013/09/09 Javascript
jQuery实现多级下拉菜单jDropMenu的方法
2015/08/28 Javascript
jquery实现顶部向右伸缩的导航区域代码
2015/09/02 Javascript
jQuery基于扩展简单实现倒计时功能的方法
2016/05/14 Javascript
利用yarn代替npm管理前端项目模块依赖的方法详解
2017/09/04 Javascript
js自定义trim函数实现删除两端空格功能
2018/02/09 Javascript
Vue-cli项目获取本地json文件数据的实例
2018/03/07 Javascript
vue-router判断页面未登录自动跳转到登录页的方法示例
2018/11/04 Javascript
浅析vue中的provide / inject 有什么用处
2019/11/10 Javascript
JS面向对象编程实现的Tab选项卡案例详解
2020/03/03 Javascript
JS 图片压缩原理与实现方法详解
2020/04/29 Javascript
javascript实现文字跑马灯效果
2020/06/18 Javascript
Python 获取新浪微博的最新公共微博实例分享
2014/07/03 Python
讲解Python中的递归函数
2015/04/27 Python
Python的网络编程库Gevent的安装及使用技巧
2016/06/24 Python
使用python编写简单的小程序编译成exe跑在win10上
2018/01/15 Python
python和pygame实现简单俄罗斯方块游戏
2021/02/19 Python
Python实现将HTML转成PDF的方法分析
2019/05/04 Python
Python监听剪切板实现方法代码实例
2020/11/11 Python
python爬虫爬取图片的简单代码
2021/01/18 Python
函授毕业自我鉴定
2013/12/19 职场文书
安全生产投入制度
2014/01/29 职场文书
护士试用期自我鉴定
2014/02/08 职场文书
旺仔牛奶广告词
2014/03/20 职场文书
2014年质量管理工作总结
2014/12/01 职场文书
2015年信贷员工作总结
2015/04/28 职场文书
信用卡工作证明范本
2015/06/19 职场文书
深入理解go slice结构
2021/09/15 Golang