稀疏矩阵相乘-Python版
稀疏矩阵相乘-Python版
Given two sparse matrices A and B, return the result of AB.
You may assume that A's column number is equal to B's row number.
Example:
-
A = [
-
[ 1, 0, 0],
-
[-1, 0, 3]
-
]
-
-
B = [
-
[ 7, 0, 0 ],
-
[ 0, 0, 0 ],
-
[ 0, 0, 1 ]
-
]
-
-
-
| 1 0 0 | | 7 0 0 | | 7 0 0 |
-
AB = | -1 0 3 | x | 0 0 0 | = | -7 0 3 |
-
| 0 0 1 |
使用传统的矩阵相乘的算法肯定会处理大量的0乘0的无用功,所以我们适当的优化算法,我们知道一个 i x k 的矩阵A乘以一个 k x j 的矩阵B会得到一个 i x j 大小的矩阵C,那么我们来看结果矩阵中的某个元素C[i][j]是怎么来的,起始是A[i][0]*B[0][j] + A[i][1]*B[1][j] + ... + A[i][k]*B[k][j],那么为了不重复计算0乘0,我们首先遍历A数组,要确保A[i][k]不为0,才继续计算,然后我们遍历B矩阵的第k行,如果B[K][J]不为0,我们累加结果矩阵res[i][j] += A[i][k] * B[k][j]; 这样我们就能高效的算出稀疏矩阵的乘法,参见代码如下:
-
# -*- coding: utf-8 -*-
-
"""
-
Created on Sun Sep 02 15:10:34 2018
-
-
@author: Administrator
-
"""
-
def SparseMatrixMultiply(A, B):#减少计算次数
-
res = [[0 for i in range(len(B[0]))] for j in range(len(A))]
-
for i in range(len(A)):
-
for j in range(len(A[0])):
-
if A[i][j] != 0:#non-zero
-
for k in range(len(B[0])):
-
if B[j][k] != 0:#non-zero
-
res[i][k] += A[i][j] * B[j][k]
-
return res
-
if __name__ == '__main__':
-
A = [[1,0,0],[-1,0,3]]
-
B = [[7,0,0],[0,0,0],[0,0,1]]
-
result = SparseMatrixMultiply(A, B)
-
print(result)
三元组方法
typedef struct NODE{ //定义稀疏矩阵结点
int i; //行
int j; //列
int data; //值
} Node;
typedef struct MATRIX{ //定义稀疏矩阵(可以快速访问)
int mu, nu, tu; // mu为矩阵行数,nu为矩阵列数,tu为矩阵中非零元素的个数
Node matrix[MAXSIZE+1];
int rpos[MAXR+1];
} Matrix;
算法时间复杂度为:O(A->tu*B->tu/B->mu)
此外还有十字链表法。
Python科学计算包scipy
import scipy as sp
a = sp.sparse.linalg.norm(S, 'fro')
稀疏矩阵相乘-Python版的更多相关文章
- [LeetCode] Sparse Matrix Multiplication 稀疏矩阵相乘
Given two sparse matrices A and B, return the result of AB. You may assume that A's column number is ...
- 【原】Learning Spark (Python版) 学习笔记(三)----工作原理、调优与Spark SQL
周末的任务是更新Learning Spark系列第三篇,以为自己写不完了,但为了改正拖延症,还是得完成给自己定的任务啊 = =.这三章主要讲Spark的运行过程(本地+集群),性能调优以及Spark ...
- 数据结构:顺序表(python版)
顺序表python版的实现(部分功能未实现) #!/usr/bin/env python # -*- coding:utf-8 -*- class SeqList(object): def __ini ...
- python版恶俗古风自动生成器.py
python版恶俗古风自动生成器.py """ python版恶俗古风自动生成器.py 模仿自: http://www.jianshu.com/p/f893291674c ...
- LAMP一键安装包(Python版)
去年有出一个python整的LAMP自动安装,不过比较傻,直接调用的yum 去安装了XXX...不过这次一样有用shell..我也想如何不调用shell 来弄一个LAMP自动安装部署啥啥的..不过尼玛 ...
- 编码的秘密(python版)
编码(python版) 最近在学习python的过程中,被不同的编码搞得有点晕,于是看了前人的留下的文档,加上自己的理解,准备写下来,分享给正在为编码苦苦了挣扎的你. 编码的概念 编码就是将信息从一种 ...
- Zabbix 微信报警Python版(带监控项波动图片)
#!/usr/bin/python # -*- coding: UTF- -*- #Function: 微信报警python版(带波动图) #Environment: python import ur ...
- 豆瓣top250(go版以及python版)
最近学习go,就找了一个例子练习[go语言爬虫]go语言爬取豆瓣电影top250,思路大概就是获取网页,然后根据页面元素,用正则表达式匹配电影名称.评分.评论人数.原文有个地方需要修改下patte ...
- python版接口自动化测试框架源码完整版(requests + unittest)
python版接口自动化测试框架:https://gitee.com/UncleYong/my_rf [框架目录结构介绍] bin: 可执行文件,程序入口 conf: 配置文件 core: 核心文件 ...
随机推荐
- frcnn_train_data_param的distort_param实现
frcnn_train_data_param frcnn_train_data_param { source: "./data/train_list.txt" root_folde ...
- 实现接口Controller定义控制器
实现接口Controller定义控制器 控制器提供访问应用程序的行为,通常通过服务接口定义或注解定义两种方法实现. 控制器解析用户的请求并将其转换为一个模型.在Spring MVC中一个控制器可以包含 ...
- block简介
ios4.0系统已开始支持block,在编程过程中,blocks被Obj-C看成是对象,它封装了一段代码,这段代码可以在任何时候执行.Blocks可以作为函数参数或者函数的返回值,而其本身又可以带输入 ...
- BZOJ1491: [NOI2007]社交网络(Floyd 最短路计数)
Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 2343 Solved: 1266[Submit][Status][Discuss] Descripti ...
- js中document的用法小结
document常用属性: document.title//设置文档标题,与HTNL中的title标签等价 document.bgColor//设置页面背景颜色 document.fgColor//设 ...
- spring cloud 学习之服务消费者(Feign)
一.Feign简介 Feign是一个声明式的伪Http客户端,它使得写Http客户端变得更简单.使用Feign,只需要创建一个接口并注解.它具有可插拔的注解特性,可使用Feign 注解和JAX-RS注 ...
- Linux帮助都有哪几种,如何使用?
帮助文件有2类,内置命令和外部命令. 其中内置命令就是shell内核自带的,因为shell当中自己要进行管理,那么就需要一些命令进行管理,不同的shell肯定有不同的shell命令,我们用type命令 ...
- chorme浏览器不支持audio/video中的autoplay属性的解决方法
在chrome 浏览器中输入:chrome://flags 再搜索audio,找到Autoplay policy 再在右侧的选项中设置为 no user gesture is required 即可
- Qt的QWebChannel和JS、HTML通信/交互驱动百度地图
Qt的QWebChannel和JS.HTML通信/交互驱动百度地图 0 前言 我一个研究嵌入式的,不知道怎么就迷上了上位机,接了几个项目都是关于Qt,这个项目还是比较经典的,自己没事儿的时候也进行研究 ...
- SAPバリアント
SAPバリアント VARI バリアント VARID バリアント一覧 VARIT バリアントテキスト VARIS バリアント割当 TVARV バリアント変数(クライアント非依存) TVARVC バリ ...