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 19 Python
Python数据结构之栈、队列的实现代码分享
Dec 04 Python
matplotlib绘制动画代码示例
Jan 02 Python
基于python实现学生管理系统
Oct 17 Python
对Python中内置异常层次结构详解
Oct 18 Python
Django 后台获取文件列表 InMemoryUploadedFile的例子
Aug 07 Python
python中字典按键或键值排序的实现代码
Aug 27 Python
解决Python图形界面中设置尺寸的问题
Mar 05 Python
Virtualenv 搭建 Py项目运行环境的教程详解
Jun 22 Python
pytorch随机采样操作SubsetRandomSampler()
Jul 07 Python
python使用Word2Vec进行情感分析解析
Jul 31 Python
全网最细 Python 格式化输出用法讲解(推荐)
Jan 18 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中集成PayPal标准支付的实现方法分享
2012/02/06 PHP
laravel 框架结合关联查询 when()用法分析
2019/11/22 PHP
收集的网上用的ajax之chat.js文件
2007/04/08 Javascript
js prototype截取字符串函数
2010/04/01 Javascript
event.currentTarget与event.target的区别介绍
2012/12/31 Javascript
jquery中show()、hide()和toggle()用法实例
2015/01/15 Javascript
JavaScript中window.open用法实例详解
2015/04/15 Javascript
jQuery实现首页顶部可伸缩广告特效代码
2015/04/15 Javascript
javascript创建函数的20种方式汇总
2015/06/23 Javascript
JS实现从连接中获取youtube的key实例
2015/07/02 Javascript
jQuery ajax全局函数处理session过期后的ajax跳转问题
2016/06/03 Javascript
connection reset by peer问题总结及解决方案
2016/10/21 Javascript
nodejs入门教程四:URL相关模块用法分析
2017/04/24 NodeJs
Vue中计算属性computed的示例解读
2017/07/26 Javascript
JS设计模式之单例模式(一)
2017/09/29 Javascript
详解Nodejs mongoose
2018/06/10 NodeJs
使用Vue实现图片上传的三种方式
2018/07/17 Javascript
在vue中使用SockJS实现webSocket通信的过程
2018/08/29 Javascript
Python自定义函数的创建、调用和函数的参数详解
2014/03/11 Python
Python中Django框架利用url来控制登录的方法
2015/07/25 Python
Python反射和内置方法重写操作详解
2018/08/27 Python
浅谈python新式类和旧式类区别
2019/04/26 Python
Python学习笔记之列表和成员运算符及列表相关方法详解
2019/08/22 Python
Django实现网页分页功能
2019/10/31 Python
django在开发中取消外键约束的实现
2020/05/20 Python
python通过cython加密代码
2020/12/11 Python
详解纯CSS3制作的20种loading动效
2017/07/05 HTML / CSS
欧迪办公美国官网:Office Depot
2016/08/22 全球购物
小区文明倡议书
2014/05/16 职场文书
企业党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
小学一年级学生评语大全
2014/12/25 职场文书
开除通知书范本
2015/04/25 职场文书
人代会简报
2015/07/21 职场文书
简单谈谈Python面向对象的相关知识
2021/06/28 Python
JavaScript函数柯里化
2021/11/07 Javascript
Python使用DFA算法过滤内容敏感词
2022/04/22 Python