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中将字典转换成其json字符串
Jul 16 Python
python中的函数用法入门教程
Sep 02 Python
Python正则表达式经典入门教程
May 22 Python
Python中用字符串调用函数或方法示例代码
Aug 04 Python
Python基于动态规划算法解决01背包问题实例
Dec 06 Python
Python3 XML 获取雅虎天气的实现方法
Feb 01 Python
Python使用progressbar模块实现的显示进度条功能
May 31 Python
pandas 数据索引与选取的实现方法
Jun 21 Python
python3.6 如何将list存入txt后再读出list的方法
Jul 02 Python
python中的split()函数和os.path.split()函数使用详解
Dec 21 Python
基于python实现地址和经纬度转换
May 19 Python
Tensorflow与RNN、双向LSTM等的踩坑记录及解决
May 31 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连接SQLServer2005的实现方法(附ntwdblib.dll下载)
2012/07/02 PHP
PHP fopen()和 file_get_contents()应用与差异介绍
2014/03/19 PHP
PHP判断当前使用的是什么浏览器(推荐)
2019/10/27 PHP
目前流行的JavaScript库的介绍及对比
2013/09/29 Javascript
JavaScript设计模式之外观模式实例
2014/10/10 Javascript
javascript正则表达式使用replace()替换手机号的方法
2015/01/19 Javascript
JS或jQuery获取ASP.NET服务器控件ID的方法
2015/06/08 Javascript
jQuery下拉友情链接美化效果代码分享
2015/08/26 Javascript
jquery通过扩展select控件实现支持enter或focus选择的方法
2015/11/19 Javascript
理解Angular数据双向绑定
2016/01/10 Javascript
深入剖析JavaScript中的函数currying柯里化
2016/04/29 Javascript
JQuery手速测试小游戏实现思路详解
2016/09/20 Javascript
js判断文件格式及大小的简单实例(必看)
2016/10/11 Javascript
JS实现类似51job上的地区选择效果示例
2016/11/17 Javascript
js编写选项卡效果
2017/05/23 Javascript
JavaScript实现省市联动过程中bug的解决方法
2017/12/04 Javascript
vue template中slot-scope/scope的使用方法
2018/09/06 Javascript
JS使用canvas中的measureText方法测量字体宽度示例
2019/02/02 Javascript
vue自定义指令directive的使用方法
2019/04/07 Javascript
vue安装遇到的5个报错及解决方法
2019/06/12 Javascript
浅谈bootstrap layer.open中end的使用方法
2019/09/12 Javascript
python基础教程之缩进介绍
2014/08/29 Python
django认证系统实现自定义权限管理的方法
2018/07/16 Python
python如何删除列为空的行
2020/07/17 Python
详解canvas.toDataURL()报错的解决方案全都在这了
2020/03/31 HTML / CSS
世界上最大的艺术和工艺用品商店:MisterArt.com
2018/07/13 全球购物
信访工作者先进事迹
2014/01/17 职场文书
家庭困难证明
2014/10/12 职场文书
党支部对转正的意见
2015/06/02 职场文书
改进工作作风心得体会
2016/01/23 职场文书
2016年小学教师师德承诺书
2016/03/25 职场文书
《风不能把阳光打败》读后感3篇
2020/01/06 职场文书
Python3.8官网文档之类的基础语法阅读
2021/09/04 Python
用Python实现屏幕截图详解
2022/01/22 Python
Android Flutter实现3D动画效果示例详解
2022/04/07 Java/Android
SQL Server #{}可以防止SQL注入
2022/05/11 SQL Server