稀疏矩阵相乘-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')
转载于:https://www.cnblogs.com/AcceptedLin/p/9778834.html
稀疏矩阵相乘-Python版相关推荐
- 解析身份证号码(Python版)
解析身份证号码(Python版) 简单分析 结构 六位数字地址码 八位数字出生日期码 三位数字顺序码 一位数字校验码 代码实现 获取身份证号里的信息 获取身份证中的省份 计算身份证校验位 验证并提取信 ...
- 基于交替迭代法的通用型交直流潮流计算方法(matlab版+python版)
程序名称## 基于交替迭代法的通用型交直流潮流计算(matlab版+python版) 程序功能(对象) 适用于任意大小的交流电网,支持节点和支路的增删: 适用于接入多个直流环节,直流环节内允许接入风光 ...
- 稀疏矩阵相乘mmult
系列文章目录 文章目录 系列文章目录 前言 一.题目描述 二.c++代码 总结 前言 <数据结构基础>c语言版 第2版,Ellis Horowitz著,朱仲涛译 1.3节,page64,程 ...
- GMM算法(python版)
原 [machine learning]GMM算法(Python版) 一.GMM模型 事实上,GMM 和 k-means 很像,不过 GMM 是学习出一些概率密度函数来(所以 GMM 除了用在 clu ...
- 【Leetcode】刷题之路3(python版)
回溯专题 1.回溯算法的本质是n叉树的深度优先搜索,同时,需要注意剪枝减少复杂度. 2.回溯算法三部曲 确定参数和返回值 回溯函数终止条件 单层循环 3.回溯法思路 回溯法是一种算法思想,而递归是一种 ...
- 统计学习圣经!经典教材《统计学习导论》Python版
↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 编辑:张倩,来源:机器之心 <统计学习导论>很经典,但习题用 ...
- python数据结构与算法分析_数据结构与算法(Python版)
为什么研究数据结构与算法 本周带大家进入Python版数据结构与算法的学习.想必大家都听过"算法"一词,算法的学习对编程者来说是至关重要的.首先我们先了解一下为什么要研究数据结构与 ...
- 经典教材《统计学习导论》现在有了Python版
来源:机器之心 本文约1000字,建议阅读5分钟 <统计学习导论>很经典,但用的是 R 语言,没关系,这里有份 Python 版习题实现. 斯坦福经典教材<The Element o ...
- 赞!经典教材《统计学习导论》终于有Python版了
<统计学习导论>是数据科学家中最受欢迎的书籍之一,旨在介绍机器学习算法背后的概念,但这本书的习题都是用R语言实现的,这对于主要使用 Python 语言的机器学习研究者来说不太友好. 为了解 ...
- Manning大神牵头,斯坦福开源Python版NLP库Stanza:涵盖66种语言
点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送达 转自:机器之心 对于斯坦福 NLP 库,我们一定不会陌生,但是这一库主要基于 Java ...
最新文章
- 推荐!神经进化才是深度学习未来的发展之路!
- python 二叉树遍历
- 网络安全等保定级_差异:关键信息基础设施与网络安全等级保护2.0
- android 如何使用android:supportsRtl属性
- 第一百五十三期: 云迁移可能失败的5种方式以及成功的5种方式
- Qt ToolBar工具栏里同时显示图标和文字
- 如何灵活使用 ActionBar, Google 音乐ActionBar 隐藏和显示效果
- Android 关机流程 从kernel到framework
- hdu 3506 Monkey Party 区间dp + 四边形不等式优化
- 初识python廖雪峰_廖雪峰Python教程[完整版]
- 关于路由器认证校园网的可行方案.md
- 实施成功的ITIL变更管理的6个步骤
- 微型计算机煎蛋网,煎蛋网 No.4950004
- python实现匿名发邮件_python 发送匿名邮件或无发件人
- STM32 EXTI外部中断
- vue mint swper
- 嵌入式硬件 软件测试,嵌入式系统软硬件功能测试方法及性能评估研究
- 经历多次重写,苹果平台最强科学计算器PCalc背后的故事
- 0724 静态购物网页
- 《要么读书,要么旅行,身体和灵魂总有一个在路上》读后感