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

转载于:https://www.cnblogs.com/AcceptedLin/p/9778834.html

稀疏矩阵相乘-Python版相关推荐

  1. 解析身份证号码(Python版)

    解析身份证号码(Python版) 简单分析 结构 六位数字地址码 八位数字出生日期码 三位数字顺序码 一位数字校验码 代码实现 获取身份证号里的信息 获取身份证中的省份 计算身份证校验位 验证并提取信 ...

  2. 基于交替迭代法的通用型交直流潮流计算方法(matlab版+python版)

    程序名称## 基于交替迭代法的通用型交直流潮流计算(matlab版+python版) 程序功能(对象) 适用于任意大小的交流电网,支持节点和支路的增删: 适用于接入多个直流环节,直流环节内允许接入风光 ...

  3. 稀疏矩阵相乘mmult

    系列文章目录 文章目录 系列文章目录 前言 一.题目描述 二.c++代码 总结 前言 <数据结构基础>c语言版 第2版,Ellis Horowitz著,朱仲涛译 1.3节,page64,程 ...

  4. GMM算法(python版)

    原 [machine learning]GMM算法(Python版) 一.GMM模型 事实上,GMM 和 k-means 很像,不过 GMM 是学习出一些概率密度函数来(所以 GMM 除了用在 clu ...

  5. 【Leetcode】刷题之路3(python版)

    回溯专题 1.回溯算法的本质是n叉树的深度优先搜索,同时,需要注意剪枝减少复杂度. 2.回溯算法三部曲 确定参数和返回值 回溯函数终止条件 单层循环 3.回溯法思路 回溯法是一种算法思想,而递归是一种 ...

  6. 统计学习圣经!经典教材《统计学习导论》Python版

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 编辑:张倩,来源:机器之心 <统计学习导论>很经典,但习题用 ...

  7. python数据结构与算法分析_数据结构与算法(Python版)

    为什么研究数据结构与算法 本周带大家进入Python版数据结构与算法的学习.想必大家都听过"算法"一词,算法的学习对编程者来说是至关重要的.首先我们先了解一下为什么要研究数据结构与 ...

  8. 经典教材《统计学习导论》现在有了Python版

    来源:机器之心 本文约1000字,建议阅读5分钟 <统计学习导论>很经典,但用的是 R 语言,没关系,这里有份 Python 版习题实现. 斯坦福经典教材<The Element o ...

  9. 赞!经典教材《统计学习导论》终于有Python版了

    <统计学习导论>是数据科学家中最受欢迎的书籍之一,旨在介绍机器学习算法背后的概念,但这本书的习题都是用R语言实现的,这对于主要使用 Python 语言的机器学习研究者来说不太友好. 为了解 ...

  10. Manning大神牵头,斯坦福开源Python版NLP库Stanza:涵盖66种语言

    点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送达 转自:机器之心 对于斯坦福 NLP 库,我们一定不会陌生,但是这一库主要基于 Java ...

最新文章

  1. 推荐!神经进化才是深度学习未来的发展之路!
  2. python 二叉树遍历
  3. 网络安全等保定级_差异:关键信息基础设施与网络安全等级保护2.0
  4. android 如何使用android:supportsRtl属性
  5. 第一百五十三期: 云迁移可能失败的5种方式以及成功的5种方式
  6. Qt ToolBar工具栏里同时显示图标和文字
  7. 如何灵活使用 ActionBar, Google 音乐ActionBar 隐藏和显示效果
  8. Android 关机流程 从kernel到framework
  9. hdu 3506 Monkey Party 区间dp + 四边形不等式优化
  10. 初识python廖雪峰_廖雪峰Python教程[完整版]
  11. 关于路由器认证校园网的可行方案.md
  12. 实施成功的ITIL变更管理的6个步骤
  13. 微型计算机煎蛋网,煎蛋网 No.4950004
  14. python实现匿名发邮件_python 发送匿名邮件或无发件人
  15. STM32 EXTI外部中断
  16. vue mint swper
  17. 嵌入式硬件 软件测试,嵌入式系统软硬件功能测试方法及性能评估研究
  18. 经历多次重写,苹果平台最强科学计算器PCalc背后的故事
  19. 0724 静态购物网页
  20. 《要么读书,要么旅行,身体和灵魂总有一个在路上》读后感

热门文章

  1. 模拟tomcat连接器
  2. 贵安新区生物医学大数据中心揭牌成立
  3. iOS内存管理学习笔记二
  4. Redis学习笔记3-Redis5个可运行程序命令的使用
  5. [BZOJ 1212][HNOI2004]L语言(AC自动机)
  6. 在windows系统中使用backoff2005的测试脚本来测试分词结果
  7. maven 多环境打包发布的两种方式
  8. 一个工作三年左右的Java程序员跟大家分享从业心得
  9. 深入 AI 之前,你需要学习的服务与框架
  10. 一张图看懂什么是运维?