稀疏矩阵相乘-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 = [
      1. [ 1, 0, 0],
        1. [-1, 0, 3]
          1. ]
              1. B = [
                1. [ 7, 0, 0 ],
                  1. [ 0, 0, 0 ],
                    1. [ 0, 0, 1 ]
                      1. ]
                            1. | 1 0 0 | | 7 0 0 | | 7 0 0 |
                              1. AB = | -1 0 3 | x | 0 0 0 | = | -7 0 3 |
                                1. | 0 0 1 |
                              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 -*-
                                  1. """
                                    1. Created on Sun Sep 02 15:10:34 2018
                                        1. @author: Administrator
                                          1. """
                                            1. def SparseMatrixMultiply(A, B):#减少计算次数
                                              1. res = [[0 for i in range(len(B[0]))] for j in range(len(A))]
                                                1. for i in range(len(A)):
                                                  1. for j in range(len(A[0])):
                                                    1. if A[i][j] != 0:#non-zero
                                                      1. for k in range(len(B[0])):
                                                        1. if B[j][k] != 0:#non-zero
                                                          1. res[i][k] += A[i][j] * B[j][k]
                                                            1. return res
                                                              1. if __name__ == '__main__':
                                                                1. A = [[1,0,0],[-1,0,3]]
                                                                  1. B = [[7,0,0],[0,0,0],[0,0,1]]
                                                                    1. result = SparseMatrixMultiply(A, B)
                                                                      1. print(result)
                                                                    1.  

                                                                    三元组方法

                                                                    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. 【转】普及一下ARM和X86的区别,鉴于ATOM已经入驻手机,AMD也会…

                                                                      这里简单来谈一下,ARM和X86之间为什么不太具有可比性的问题.要搞清楚这个问题首先要明白什么是架构,之前也有很多人提到了架构不同,但架构是什么意思?它是一个比较抽象的概念,不太容易用几句话就解释清楚 ...

                                                                    2. Linux(三) - 文件操作相关命令

                                                                      Ctl-A 光标移动到行首 Ctl-C 终止命令 Ctl-D 注销登录 Ctl-E 光标移动到行尾 Ctl-U 删除光标到行首的所有字符,在某些设置下,删除全行 Ctl-W 删除当前光标到前边的最近一 ...

                                                                    3. 在IDEA中创建Maven项目和添加tomcat

                                                                      IDEA中创建是一种创建maven项目的办法,但不推荐,因为没有使用统一的骨架,可以一开始就选择创建maven项目,步骤如下: 第一步 第二步:设置项目 第三步:进行配置好maven,加上 arche ...

                                                                    4. 一个老鸟发的公司内部整理的 Android 学习路线图 Markdown 版本

                                                                      jixiaohua发了一篇一个老鸟也发了一份他给公司内部小伙伴整理的路线图.另一份 Android 开发学习路线图.可惜不是MarkDown格式的,所以jixiaohua直接上传的截图,在jixiao ...

                                                                    5. LeetCode567. Permutation in String

                                                                      Given two strings s1 and s2, write a function to return true if s2 contains the permutation of s1. I ...

                                                                    6. 牛客小白月赛2 H 武 【Dijkstra】

                                                                      链接:https://www.nowcoder.com/acm/contest/86/H来源:牛客网 题目描述 其次,Sεlιнα(Selina) 要进行体力比武竞赛. 在 Sεlιнα 所在的城市, ...

                                                                    7. javascript常用代码片段

                                                                      /** * * @desc 判断两个数组是否相等 * @param {Array} arr1 * @param {Array} arr2 * @return {Boolean} */ function ...

                                                                    8. React路由-进阶篇

                                                                      路由进阶 1.多级路由,和之前的思想一样,在子路由里面继续写Route,继续挂载组件,就可以实现多级路由 比如这样:class Food extends Component{ render() { r ...

                                                                    9. scrapy--cnblogs

                                                                      之前一直在学习关于滑块验证码的爬虫知识,最接近的当属于模拟人的行为进行鼠标移动,登录页面之后在获取了,由于一直找不到滑块验证码的原图,无法通过openCV获取当前滑块所需要移动的距离. 1.机智如我开 ...

                                                                    10. is和==,encode和decode

                                                                      0.编码解码 >encode和decode a = "你好" s = a.encode("GBK") print(s) # b'\xc4\xe3\xba\ ...