稀疏矩阵相乘-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:


  1. A = [
  2. [ 1, 0, 0],
  3. [-1, 0, 3]
  4. ]
  5. B = [
  6. [ 7, 0, 0 ],
  7. [ 0, 0, 0 ],
  8. [ 0, 0, 1 ]
  9. ]
  10. | 1 0 0 | | 7 0 0 | | 7 0 0 |
  11. AB = | -1 0 3 | x | 0 0 0 | = | -7 0 3 |
  12. | 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]; 这样我们就能高效的算出稀疏矩阵的乘法,参见代码如下:


  1. # -*- coding: utf-8 -*-
  2. """
  3. Created on Sun Sep 02 15:10:34 2018
  4. @author: Administrator
  5. """
  6. def SparseMatrixMultiply(A, B):#减少计算次数
  7. res = [[0 for i in range(len(B[0]))] for j in range(len(A))]
  8. for i in range(len(A)):
  9. for j in range(len(A[0])):
  10. if A[i][j] != 0:#non-zero
  11. for k in range(len(B[0])):
  12. if B[j][k] != 0:#non-zero
  13. res[i][k] += A[i][j] * B[j][k]
  14. return res
  15. if __name__ == '__main__':
  16. A = [[1,0,0],[-1,0,3]]
  17. B = [[7,0,0],[0,0,0],[0,0,1]]
  18. result = SparseMatrixMultiply(A, B)
  19. 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版的更多相关文章

  1. [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 ...

  2. 【原】Learning Spark (Python版) 学习笔记(三)----工作原理、调优与Spark SQL

    周末的任务是更新Learning Spark系列第三篇,以为自己写不完了,但为了改正拖延症,还是得完成给自己定的任务啊 = =.这三章主要讲Spark的运行过程(本地+集群),性能调优以及Spark ...

  3. 数据结构:顺序表(python版)

    顺序表python版的实现(部分功能未实现) #!/usr/bin/env python # -*- coding:utf-8 -*- class SeqList(object): def __ini ...

  4. python版恶俗古风自动生成器.py

    python版恶俗古风自动生成器.py """ python版恶俗古风自动生成器.py 模仿自: http://www.jianshu.com/p/f893291674c ...

  5. LAMP一键安装包(Python版)

    去年有出一个python整的LAMP自动安装,不过比较傻,直接调用的yum 去安装了XXX...不过这次一样有用shell..我也想如何不调用shell 来弄一个LAMP自动安装部署啥啥的..不过尼玛 ...

  6. 编码的秘密(python版)

    编码(python版) 最近在学习python的过程中,被不同的编码搞得有点晕,于是看了前人的留下的文档,加上自己的理解,准备写下来,分享给正在为编码苦苦了挣扎的你. 编码的概念 编码就是将信息从一种 ...

  7. Zabbix 微信报警Python版(带监控项波动图片)

    #!/usr/bin/python # -*- coding: UTF- -*- #Function: 微信报警python版(带波动图) #Environment: python import ur ...

  8. 豆瓣top250(go版以及python版)

      最近学习go,就找了一个例子练习[go语言爬虫]go语言爬取豆瓣电影top250,思路大概就是获取网页,然后根据页面元素,用正则表达式匹配电影名称.评分.评论人数.原文有个地方需要修改下patte ...

  9. python版接口自动化测试框架源码完整版(requests + unittest)

    python版接口自动化测试框架:https://gitee.com/UncleYong/my_rf [框架目录结构介绍] bin: 可执行文件,程序入口 conf: 配置文件 core: 核心文件 ...

随机推荐

  1. FastRCNN 训练自己数据集 (1编译配置)

    http://www.cnblogs.com/louyihang-loves-baiyan/p/4885659.html 按照博客的教程配置,但自己在服务器上配置时,USE_CUDNN = 1会报错, ...

  2. 获取页面的url

    设当前页完整地址是:http://www.jb51.net/aaa/bbb.aspx?id=5&name=kelli "http://"是协议名 "www.jb5 ...

  3. Spring/Spring boot中静态变量赋值

    情形1:静态变量为自动注入的对象 解决方案:设置两个变量,非静态变量使用@resource注入Bean,然后使用@PostConstruct在Spring初始化Bean成功后为静态变量赋值 @Comp ...

  4. ES5 与 ES6六大不同

    1.类Class 2.模块Module 导出变量 导出函数 导入 3.箭头函数 4.不再支持Mixins. 5.ES6不再支持自动绑定.

  5. react的 react-router使用

    官方API:https://reacttraining.com/react-router/web/api/BrowserRouter; React Router 安装命令如下. 使用时,路由器Rout ...

  6. 【MYSQL笔记2】复制表,在已有表的基础上设置主键,insert和replace

    之前我自己建立好了一个数据库xscj:表xs是已经定义好的 具体的定义数据类型如下: 为了复制表xs,我们新建一个表名为xstext,使用下列语句进行复制xs,或者说是备份都可以: create ta ...

  7. django连接mysql数据库配置,出现no module named mysqldb报错

    作为一个菜鸟运维也是要有梦想的,万一学会了python走向人生巅峰了呢.好吧,都是瞎想,今天主要介绍下django配置,最近也开始摸索这个牛b框架了,当然大佬肯定不屑一顾,都是照顾照顾我们这些菜鸟初学 ...

  8. js动画之无缝滚动

    效果图如下: HTML代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charse ...

  9. JDK1.8简单配置环境变量---两步曲

    鄙人最近重新装完系统之后,在安装和配置jdk1.8的时候,发现网上许多教程配置jdk环境变量时都还在沿用传统的方式配置,但是随着技术的更新,完全没有必要那么麻烦了. 下载和安装jdk的教程,在这里就不 ...

  10. logrus学习笔记

    logrus源码:https://github.com/sirupsen/logrus 1.logrus.Entry结构 1.1 类型 type Entry struct { Logger *Logg ...