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中使用next()方法操作文件的教程
May 24 Python
Django返回json数据用法示例
Sep 18 Python
python 3.0 模拟用户登录功能并实现三次错误锁定
Nov 01 Python
Python向MySQL批量插数据的实例讲解
Mar 31 Python
用TensorFlow实现戴明回归算法的示例
May 02 Python
如何优雅地改进Django中的模板碎片缓存详解
Jul 04 Python
Python实现多线程的两种方式分析
Aug 29 Python
python进程间通信Queue工作过程详解
Nov 01 Python
python实现QQ邮箱发送邮件
Mar 06 Python
使用Python实现NBA球员数据查询小程序功能
Nov 09 Python
Python新建项目自动添加介绍和utf-8编码的方法
Dec 26 Python
Python 读写 Matlab Mat 格式数据的操作
May 19 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入门学习的几个不错的实例代码
2008/07/13 PHP
php读取富文本的时p标签会出现红线是怎么回事
2014/05/13 PHP
CodeIgniter常用知识点小结
2016/05/26 PHP
php实现替换手机号中间数字为*号及隐藏IP最后几位的方法
2016/11/16 PHP
Laravel 5.4因特殊字段太长导致migrations报错的解决
2017/10/22 PHP
smarty模板的使用方法实例分析
2019/09/18 PHP
JavaScript中对象介绍
2014/12/31 Javascript
jquery ajax 如何向jsp提交表单数据
2015/08/23 Javascript
javascript电商网站抢购倒计时效果实现
2015/11/19 Javascript
利用jquery正则表达式在页面验证url网址输入是否正确
2017/04/04 jQuery
jQuery上传插件webupload使用方法
2017/08/01 jQuery
node.js遍历目录的方法示例
2018/08/01 Javascript
jQuery实现根据身份证号获取生日、年龄、性别等信息的方法
2019/01/09 jQuery
vue自定义标签和单页面多路由的实现代码
2020/05/03 Javascript
微信小程序手动添加收货地址省市区联动
2020/05/18 Javascript
JS算法教程之字符串去重与字符串反转
2020/12/15 Javascript
关于element的表单组件整理笔记
2021/02/05 Javascript
python实现监控linux性能及进程消耗性能的方法
2014/07/25 Python
python相似模块用例
2016/03/04 Python
深入理解NumPy简明教程---数组1
2016/12/17 Python
Python基于辗转相除法求解最大公约数的方法示例
2018/04/04 Python
在Python中增加和插入元素的示例
2018/11/01 Python
Python操作json的方法实例分析
2018/12/06 Python
Python获取航线信息并且制作成图的讲解
2019/01/03 Python
Python设计模式之适配器模式原理与用法详解
2019/01/15 Python
python redis连接 有序集合去重的代码
2019/08/04 Python
python3.7 openpyxl 删除指定一列或者一行的代码
2019/10/08 Python
numpy 声明空数组详解
2019/12/05 Python
详解基于Jupyter notebooks采用sklearn库实现多元回归方程编程
2020/03/25 Python
Python Mock模块原理及使用方法详解
2020/07/07 Python
PyCharm最新激活码PyCharm2020.2.3有效
2020/11/18 Python
详解Html5中video标签那些属性和方法
2019/07/01 HTML / CSS
美国新蛋IT数码商城:Newegg.com
2016/07/21 全球购物
党员思想汇报范文
2013/12/30 职场文书
试用期转正后的自我评价
2014/09/21 职场文书
2015年音乐教研组工作总结
2015/07/22 职场文书