MXNet中图解稀疏矩阵(Sparse Matrix)的压缩与还原

news2024/12/25 13:00:00

1、概述

对于稀疏矩阵的解释,就是当矩阵里面零元素远远多于非零元素,且非零元素没有规律,这样的矩阵就叫做稀疏矩阵,反过来就是稠密矩阵,其中非零元素的数量与所有元素的比值叫做稠密度,一般稠密度小于0.05的都叫做稀疏矩阵。
我们知道压缩文件的时候,可以将大文件压缩成一个很小的文件,这是因为存在很多冗余,我们通过压缩算法将其进行压缩,同样的,既然矩阵里面存在很多零元素,我们也是可以将其剔除,这样就可以节省大量的存储空间了,而且可以提高计算的性能节约大量时间。其应用非常广泛,计算流体力学、统计物理、电路模拟、图像处理、纳米材料计算等。

2、压缩稀疏矩阵

那如何对其进行压缩以及还原呢,这里会将稀疏矩阵压缩成三个数组data、indptr、indices,让后通过这三个数组又可以进行还原成原来的矩阵。

data:只存储非零元素
indptr:存储的是非零元素每行的累加数量,这样就能知道每行有多少个非零元素,当然这里为了计算每行的数量,也就是通过indptr[i+1] - indptr[i]可以计算到第i行的数量,为了便于计算第一行的数量,这里数组第一个元素设定为0
indices:存储非零元素所在列的索引值,这样就可以定位其在稀疏矩阵中的位置

通过这三个数组,我们就能够快速地找到任意非零元素的位置,从而进行矩阵运算和求解,大大减少计算时间。
我们通常会使用一种称为压缩稀疏行(Compressed Sparse Row,CSR)或者压缩稀疏矩阵(Compressed Sparse Matrix,CSM)的存储方式。
接下来我们看下载MXNet中的实际应用。

3、示例1

3.1、拆分稀疏矩阵

from mxnet import nd
import mxnet as mx
n1 = nd.array([[1,0,0,0],[4,0,2,0],[0,0,0,3],[5,1,0,0]])
/*
[[1. 0. 0. 0.]
 [4. 0. 2. 0.]
 [0. 0. 0. 3.]
 [5. 1. 0. 0.]]
<NDArray 4x4 @cpu(0)>
*/

稠密矩阵转换成稀疏矩阵 

n1_csr = n1.tostype('csr')
<CSRNDArray 4x4 @cpu(0)>

非零元素

n1_data = n1_csr.data
[1. 4. 2. 3. 5. 1.]
<NDArray 6 @cpu(0)>

非零元素每行的累加数量

n1_indptr = n1_csr.indptr
[0 1 3 4 6]
<NDArray 5 @cpu(0)>

这里就可以得到第几行有几个非零元素,比如第二行有两个非零元素,我们通过 n1_indptr[2]-n1_indptr[1] 即可获取。

非零元素的位置

n1_indices = n1_csr.indices
[0 0 2 3 0 1]
<NDArray 6 @cpu(0)>

这样就将n1这样一个稀疏矩阵拆分成了三个数组,尤其是在实践中会经常碰见大的稀疏矩阵,这样拆分的小数组,就起到了很好的压缩的效果。

3.2、稀疏转换稠密

前面是稠密矩转换成稀疏矩阵,当然也可以将稀疏矩阵转换成稠密矩阵,两种方法,最简单的就是直接强制类型转换:

n1_csr.asnumpy()
array([[1., 0., 0., 0.],
       [4., 0., 2., 0.],
       [0., 0., 0., 3.],
       [5., 1., 0., 0.]], dtype=float32)

另外一种方法就是将三个拆分的数组进行组合:

n1_o = nd.sparse.csr_matrix((n1_data, n1_indices, n1_indptr), shape = (4, 4))
n1_o.asnumpy()
array([[1., 0., 0., 0.],
       [4., 0., 2., 0.],
       [0., 0., 0., 3.],
       [5., 1., 0., 0.]], dtype=float32)

这里还可以对形状进行指定,比如只截取3x3的矩阵:

n1_o = nd.sparse.csr_matrix((n1_data, n1_indices, n1_indptr), shape = (3,3))
n1_o.asnumpy()
array([[1., 0., 0.],
       [4., 0., 2.],
       [0., 0., 0.]], dtype=float32)

也可以直接定义为稀疏矩阵:

src = nd.sparse.zeros('csr', (3,3))
<CSRNDArray 3x3 @cpu(0)>

3.3、不同上下文比较

from mxnet import nd
import mxnet as mx

x = nd.ones((2,3)) # 默认是CPU
y = x.as_in_context(mx.cpu())
z = x.as_in_context(mx.gpu())

y is x # True
z is x # False

就算它们的值是一样的,不在同一个上下文的值也是不能比较,这里很明显一个在CPU上计算,另一个是在GPU上计算。

4、示例2

再来看一个例子进行巩固下,后面也会以这个例子做一张图,了解稀疏矩阵的拆分原理。

也就是在上面例子增加一行全是0元素,这样就更加明白那个累加数量indptr的含义

from mxnet import nd
import mxnet as mx

n2 = nd.array([[1,0,0,0],[4,0,2,0],[0,0,0,0],[0,0,0,3],[5,1,0,0]])
[[1. 0. 0. 0.]
 [4. 0. 2. 0.]
 [0. 0. 0. 0.]
 [0. 0. 0. 3.]
 [5. 1. 0. 0.]]
<NDArray 5x4 @cpu(0)>
n2_csr = n2.tostype('csr')
<CSRNDArray 5x4 @cpu(0)>

n2_data = n2_csr.data
[1. 4. 2. 3. 5. 1.]
<NDArray 6 @cpu(0)>

n2_indptr = n2_csr.indptr
[0 1 3 3 4 6]
<NDArray 6 @cpu(0)>

n2_indices = n2_csr.indices
[0 0 2 3 0 1]
<NDArray 6 @cpu(0)>

5、图解

有了以上的介绍,应该都很熟悉这个稀疏矩阵,最后本人画了一张图,这样更能直观感受下稀疏矩阵拆分成三个数组的整个过程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1180090.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

妙用Java 8中的 Function接口,消灭if...else(非常新颖的写法)

文章目录 Function 函数式接口Supplier供给型函数Consumer消费型函数Runnable无参无返回型函数Function函数的表现形式为接收一个参数&#xff0c;并返回一个值。Supplier、Consumer和Runnable可以看作Function的一种特殊表现形式 使用小技巧处理抛出异常的if处理if分支操作如果…

项目流程管理工具 OmniPlan Pro 4 mac中文版软件介绍

OmniPlan Pro mac是 The Omni Group 为 macOS 和 iOS 操作系统开发的项目管理软件。它允许用户创建和管理复杂的项目、定义任务、分配资源、跟踪进度和生成报告。 OmniPlan Pro mac包括甘特图、网络图、关键路径分析、资源均衡和成本跟踪等功能。 借助 OmniPlan Pro&#xff0…

G3ESa HENF318736R1 E3EB HENF315129R1

G3ESa HENF318736R1 E3EB HENF315129R1 该ARC研究探索了当前和历史市场表现以及相关技术和业务趋势&#xff0c;确定了领先的技术供应商&#xff0c;并为中央电站发电应用中的分布式控制系统的全球市场提供了五年全球预测。这项新研究基于ARC行业领先的市场研究数据库、广泛的…

《安富莱嵌入式周报》第326期:航空航天级CANopen协议栈,开源USB PD电源和功耗分析,开源EtherCAT伺服驱动板,时序绘制软件,现代机器人设计

周报汇总地址&#xff1a;嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 更新一期视频教程&#xff1a; BSP视频教程第28期&#xff1a;CANopen协议栈专题&#xff0c;CANopen主从机组网实战&a…

分享34个发布商会PPT,总有一款适合您

分享34个发布商会PPT&#xff0c;总有一款适合您 链接&#xff1a;https://pan.baidu.com/s/1jP9toqTZONWeDIcxvw1wxg?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不易。知识付费甚…

重装系统后,anaconda如何恢复

电脑中给予anaconda创建了100个虚拟环境&#xff08;夸张了&#xff09; 因为硬盘的问题&#xff0c;需要重装系统&#xff0c;于是搜了一下如何恢复anaconda&#xff0c;如下&#xff1a; 1. cd 到anaconda的安装路径&#xff1b; 2. 运行下面命令&#xff1a; python .\L…

建设项目管理中的 5 大预算挑战

为建设项目管理制定可靠、准确的预算是一项艰巨的任务&#xff0c;对于中小型建筑企业来说尤其如此。预算必须精确&#xff0c;同时还要考虑到每项工作的独特性和复杂性。 一项建筑行业相关调查统计了参与施工预算流程的人员所面临的最大挑战&#xff0c;分别是时间、预算、不…

V90伺服EPOS模式点动控制(详细介绍+完整SCL代码)

V90伺服驱动器采用西门子标准报文111加FB284(SINA_POS)详细的报文组态和功能块请参考下面文章链接: 博途1200/1500PLC V90 PN通信控制 (FB284功能块)_fb284功能块文档说明_RXXW_Dor的博客-CSDN博客文章浏览阅读5.3k次。先简单说下如何获取FB284,一般有2种方法,Startdrive软…

java项目之摄影器材租赁系统(ssm框架)

项目简介 摄影器材租赁系统实现了以下功能&#xff1a; 管理员&#xff1a;个人中心、用户管理、商家管理、器材信息管理、器材租赁管理、聊天信息管理、聊天回复管理、归还提醒管理、租赁反馈管理、论坛管理、系统管理、我的收藏管理 押金缴纳管理、扣除押金管理等等。用户&…

二百零一、Flink——Flink配置状态后端运行后报错:Can not create a Path from an empty string

一、目的 在尚硅谷学习用Flink配置状态后端的项目中&#xff0c;运行报错Exception in thread "main" java.lang.IllegalArgumentException: Can not create a Path from an empty string 二、Flink的状态后端(state backend)类型 &#xff08;一&#xff09;Memo…

Linux系统安装宝塔面板

系统安装要求 宝塔Linux面板操作系统支持&#xff1a;Centos、Ubuntu、Deepin、Alibaba Cloud Linux、Debian和Fedora&#xff0c;建议使用购买ECS后全新未操作的系统或执行初始化后的系统。 不支持32位系统。 请确认在安装宝塔面板前&#xff0c;未通过任何方式或程序安装Ap…

1.1 微信支付接入指引与支付安全

微信支付接入指引与支付安全 文章目录 微信支付接入指引与支付安全一、微信产品介绍1.1 付款码支付1.2 JSAPI支付1.3 小程序支付1.4 Native支付1.5 APP支付1.6 刷脸支付 二、接入指引2.1 获取商户号2.2 获取AppID2.3 绑定商户号与AppId2.4 获取秘钥和证书2.4.1 申请API秘钥2.4.…

Java进阶篇--Executors类创建常见线程池

目录 线程池架构 newSingleThreadExecutor newFixedThreadPool newCachedThreadPool newScheduledThreadPool Executors和ThreaPoolExecutor创建线程池的区别 两种提交任务的方法 线程池架构 线程池是一种线程管理的机制&#xff0c;用于维护和复用线程&#xff0c;以…

手术训练系统项目

★ 手术训练系统项目 项目描述&#xff1a;手术训练系统&#xff0c;它提供了多项功能&#xff0c;包括账户登录与创建、数据库与账户管理、课程管理、小组管理、成绩统计、证书发布、训练和系统设置。 职责描述: 1、训练功能开发&#xff08;任务概述、任务指导、评分规则、评…

惊艳!拓世法宝AI智能数字人一体机解锁数字文博的全民体验

在数字化的潮流中&#xff0c;我们见证了历史与现代技术的完美融合。在今年的“国际古迹遗址日”&#xff0c;世界首个超时空参与式博物馆“数字藏经洞”正式与公众见面&#xff0c;在这里开启了一场前所未有的文化探索之旅。 时间和空间被艺术化的数字技术巧妙地折叠&#xf…

建链时,please install openssl! use “openssl version“ command to check.

please install openssl! use “openssl version” command to check. 但是我已经安装了 编辑build_chain.sh文件 也可以用vi或者gedit命令 将 [ ! -z “ ( o p e n s s l v e r s i o n ∣ g r e p 1.0.2 ) " ] ∣ ∣ [ ! − z " (openssl version | grep 1.0.2)…

YOLO目标检测——红绿灯检测数据集【含对应voc、coco和yolo三种格式标签】

实际项目应用&#xff1a;红绿灯检测数据集在自动驾驶、交通安全监控、智能交通系统、交通流量监测和驾驶员辅助系统等领域都有广泛应用的潜力数据集说明&#xff1a;红绿灯检测数据集&#xff0c;真实场景的高质量图片数据&#xff0c;数据场景丰富&#xff0c;含有国内红绿灯…

ARM64 linux并发与同步之原子操作

卷2&#xff1a;调试与案例分析 第一章 并发与同步 画了两张简图&#xff0c;方便理解&#xff0c;如下&#xff1a; 针对并发源的问题&#xff0c;我接触的项目中都是SMP系统&#xff0c;目前大部分也都是SMP系统&#xff1b; 对于SMP系统&#xff0c;情况会更复杂。 □ 同…

第二证券:特斯拉将推出低价电动汽车?最新消息

当地时间周一&#xff0c;投资者接连上星期五的达观心境&#xff0c;美国三大股指高开高走。美联储主席鲍威尔本周到会活动时将有两次揭穿说话&#xff0c;投资者期望从中得到更多关于本轮加息周期完毕的信号&#xff0c;但也对联邦基金利率可能在更长时期内维持在高水平保持警…

我的创作纪念日——2048天

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…