第3章 数组与矩阵——3.5 稀疏矩阵

简介: 第3章 数组与矩阵——3.5 稀疏矩阵

3.5  稀疏矩阵


在许多问题中提到了含有大量0元素的矩阵,这样的矩阵称为稀疏矩阵。为了节省存储空间和计算时间,MATLAB考虑到矩阵的稀疏性,在对它进行运算时有特殊的命令。

一个稀疏矩阵中有许多元素等于零,这便于矩阵的计算和保存。如果MATLAB把一个矩阵当作稀疏矩阵,那么只需在m×3的矩阵中存储m个非零项。第1列是行下标,第2列是列下标,第3列是非零元素值,不必保存0元素。如果存储每个浮点数需要8字节,存储每个下标需要4字节,那么整个矩阵在内存中存储需要16×m字节。


3-51:稀疏矩阵与普通矩阵示例。

在命令行窗口中输入:

A = eye(1000);    % 得到一个1000×1000的单位矩阵
B = speye(1000);      % 得到一个1000×3的矩阵,每行包含行下标、列下标及元素本身

上例中的矩阵A存储需要8MB空间,而稀疏矩阵B存储只需16KB空间,其所需空间只是单位矩阵的0.2%。对于许多的广义矩阵也可这样来做。

前面章节中的算术运算和逻辑运算都适用于稀疏矩阵。而相对于普通矩阵来说,稀疏矩阵的计算速度更快,因为MATLAB只对非零元素进行操作,这是稀疏矩阵第二个突出的优点。例如,在上例中,2A需要100万次浮点运算,而计算2B只需要2000次浮点运算。因为MATLAB不能自动创建稀疏矩阵,所以要用特殊的命令来得到稀疏矩阵。

稀疏矩阵大部分元素是0,因此只需存储非零元素的下标和元素值,这种特殊的存储方式可以节省大量的存储空间和不必要的运算。


3.5.1  稀疏矩阵的存储方式


对于稀疏矩阵,MATLAB仅存储矩阵所有的非零元素的值及其位置(行号和列号)。显然,这对于具有大量0元素的稀疏矩阵来说是十分有效的。

设矩阵798894417187f71bc40c4cc2bdf56681_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png是具有稀疏矩阵特征的矩阵,其完全存储方式是按列存储的全部12个元素:1,0,2,0,5,0,0,0,0,0,0,7;其稀疏存储方式为:(1,1),1,(3,1),2,(2,2),5,(3,4),7

其中,括号内为元素的行列位置,后面为元素值。当矩阵非常稀疏时,会有效地节省存储空间。


3.5.2  稀疏矩阵的生成


MATLAB中提供了多种创建稀疏矩阵的方法。

利用sparse函数由满矩阵转换得到稀疏矩阵。

利用一些特定函数创建包括单位稀疏矩阵在内的特殊稀疏矩阵。


1.利用sparse函数创建一般稀疏矩阵


稀疏矩阵的指令集如表3-4所示。

3-4  稀疏矩阵的指令集

b4994fad6dba3f3e05afaa336142609e_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


3-52:输入一个稀疏矩阵示例。

在命令行窗口中输入:

S = sparse([1,2,3,4,5],[2,1,4,6,2],[10,3,-2,-5,1],10,12)

结果如下:

S =
   (2,1)        3
   (1,2)       10
   (5,2)        1
   (3,4)       -2
   (4,6)       -5

在命令行窗口中输入:

full(S)

结果如下:

ans =
     0    10     0     0     0     0     0     0     0     0     0     0
     3     0     0     0     0     0     0     0     0     0     0     0
     0     0     0    -2     0     0     0     0     0     0     0     0
     0     0     0     0     0    -5     0     0     0     0     0     0
     0     1     0     0     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0     0     0     0     0


此外,sparse函数还可以将一个满矩阵转换成一个稀疏矩阵,相应的调用格式如下。

● S=sparse(X)X为满矩阵。


例如矩阵A= 7e6b6039225eb8a1bda71408232b3343_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

输入命令:

A = [1 0 0 0;0 5 0 0;2 0 0 7]
S = sparse(A)

得到结果如下:

A =
     1     0     0     0
     0     5     0     0
     2     0     0     7
S =
   (1,1)        1
   (3,1)        2
   (2,2)        5
   (3,4)        7


反之,MATLAB中提供了full()函数把稀疏矩阵转换为满矩阵。full()函数的调用格式如下。

● A=full(S)S为稀疏矩阵。


例如将上例中得到的稀疏矩阵S转换为满矩阵。

输入命令:

B = full(S)

得到结果如下:

B =
     1     0     0     0
     0     5     0     0
     2     0     0     7


3-53:将普通矩阵转换为稀疏矩阵示例。

在命令行窗口中输入:

clear all
A = rand(16,9) > 0.95
S = sparse(A)            % 创建稀疏矩阵
whos

输出结果:

A =
  16×9 logical 数组
   0   0   0   0   0   0   0   1   0
   0   0   1   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0
   1   0   0   1   0   0   0   0   0
   1   0   0   0   0   0   0   1   0
   0   0   0   0   0   0   0   0   0
   1   0   0   0   0   0   0   0   0
   1   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0
   0   0   0   1   0   0   0   0   0
   0   0   0   0   0   0   0   0   0
   1   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0
S =
  16×9 稀疏 logical 数组
   (4,1)      1
   (5,1)      1
   (7,1)      1
   (8,1)      1
  (15,1)      1
   (2,3)      1
   (4,4)      1
  (13,4)      1
   (1,8)      1
   (5,8)      1
  Name       Size            Bytes  Class      Attributes
  A         16x9               144  logical              
  S         16x9               170  logical    sparse


3-54:查看稀疏矩阵中非零元素的信息示例。

在命令行窗口中输入:

clear all
A = [0 0 0 1;0 0 8 0;4 0 0 0;0 0 0 0]
S = sparse(A)            % 创建稀疏矩阵
whos
n1 = nnz(S)              % 查看非零元素的个数
n2 = nonzeros(S)         % 查看非零元素的值
n3 = nzmax(S)            % 查看稀疏矩阵的存储空间
spy(S)
n4 = nnz(S) / prod(size(S))

输出结果:

A =
     0     0     0     1
     0     0     8     0
     4     0     0     0
     0     0     0     0
S =
   (3,1)        4
   (2,3)        8
   (1,4)        1
  Name      Size            Bytes  Class     Attributes
  A         4x4               128  double             
  S         4x4                88  double    sparse   
n1 =
     3
n2 =
     4
     8
     1
n3 =
     3
n4 =
    0.1875


利用spy()函数可以对稀疏矩阵中非零元素的分布进行图形化显示,如图3-4所示。采用nnz(S)/prod(size(S))计算稀疏矩阵的非零元素密度。

2bef5c047c940bc06eb256153a179cb7_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

3-4  稀疏矩阵中非零元素的分布的图形化显示


2.利用特定函数创建特殊稀疏矩阵


MATLAB中提供了一些函数来创建特殊的稀疏矩阵,这些函数如表3-5所示。

3-5  特殊稀疏矩阵的创建函数

d1a908e1b3c8db36d918bdc655f79e6a_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


3-55:利用speye函数创建单位稀疏矩阵示例。

在命令行窗口中输入:

clear all
A = speye(5)          % 创建5阶单位稀疏矩阵
B = speye(5,6)        % 创建5×6的稀疏矩阵
C = full(A)
D = full(B)

输出结果:

A =
   (1,1)        1
   (2,2)        1
   (3,3)        1
   (4,4)        1
   (5,5)        1
B =
   (1,1)        1
   (2,2)        1
   (3,3)        1
   (4,4)        1
   (5,5)        1
C =
     1     0     0     0     0
     0     1     0     0     0
     0     0     1     0     0
     0     0     0     1     0
     0     0     0     0     1
D =
     1     0     0     0     0     0
     0     1     0     0     0     0
     0     0     1     0     0     0
     0     0     0     1     0     0
     0     0     0     0     1     0


3-56:创建非零元素为随机数的对称稀疏矩阵示例。

在命令行窗口中输入:

clear all
A = sprandsym(5,0.1)     % 创建非零元素为随机数的对称稀疏矩阵
B = spones(A)            % 创建非零元素为1的与矩阵A维数相同的对称稀疏矩阵
C = full(A)
D = full(B)

输出结果:

A =
   (5,1)      -1.1564
   (5,3)      -0.5336
   (1,5)      -1.1564
   (3,5)      -0.5336
B =
   (5,1)        1
   (5,3)        1
   (1,5)        1
   (3,5)        1
C =
         0         0         0         0   -1.1564
         0         0         0         0         0
         0         0         0         0   -0.5336
         0         0         0         0         0
   -1.1564         0   -0.5336         0         0
D =
     0     0     0     0     1
     0     0     0     0     0
     0     0     0     0     1
     0     0     0     0     0
     1     0     1     0     0


3.5.3  稀疏矩阵的运算


满矩阵的四则运算对稀疏矩阵同样有效,但是返回结果有可能是稀疏矩阵或满矩阵。

对于单个稀疏矩阵的输入,大部分函数输出的结果都是稀疏矩阵,有部分函数输出的结果是满矩阵。对于多个矩阵的输入,如果其中至少有一个矩阵是满矩阵,那么大部分函数的输出结果是满矩阵。

对于矩阵的加、减、乘、除运算,只要其中有一个矩阵是满矩阵,则输出的结果都是满矩阵。

稀疏矩阵的数乘为稀疏矩阵;稀疏矩阵的幂为稀疏矩阵。





本章小结


本章介绍了MATLAB数组与矩阵的相关知识,主要内容包括数组运算、矩阵操作、矩阵元素的运算、矩阵运算和稀疏矩阵等。本章是理解MATLAB运算方式的重点,因为在MATLAB中所有的数据都是通过数组或矩阵的方式组织并进行计算的。要掌握好本章的内容,还需要了解更多的知识,读者可查阅相关的书籍和MATLAB帮助文件等。


相关文章
|
存储 NoSQL Linux
JuiceFS-开源分布式文件系统入门(一篇就够了)(下)
JuiceFS-开源分布式文件系统入门(一篇就够了)(下)
1040 0
|
存储 前端开发 Java
【开题报告】基于SpringBoot的非文化遗产宣传平台的设计与实现
【开题报告】基于SpringBoot的非文化遗产宣传平台的设计与实现
1337 0
|
存储 前端开发 JavaScript
ahooks 正式发布:值得拥抱的 React Hooks 工具库
ahook定位于一套基于 React Hooks 的工具库,核心围绕 React Hooks 的逻辑封装能力,降低代码复杂度和避免团队的重复建设为背景,共同建设和维护阿里经济体层面的 React Hooks 库。
24443 1
ahooks 正式发布:值得拥抱的 React Hooks 工具库
|
机器人
智能电话机器人源码系统 的VAD和CNG
概观 VAD概述 VAD代表语音活动检测。它的作用是区分声音和其他任何东西,包括沉默。在VoIP应用中,它可以用作最小化传输的音频分组数量的工具。如果没有人说话,则可以停止音频数据包的流动,或者至少改变为低得多的舒适噪声数据包
1148 0
【计算机网络】网络层 : IP 数据报分片 ( 数据分片机制 | 分片示例 | 三种数据长度单位 )
【计算机网络】网络层 : IP 数据报分片 ( 数据分片机制 | 分片示例 | 三种数据长度单位 )
1948 0
【计算机网络】网络层 : IP 数据报分片 ( 数据分片机制 | 分片示例 | 三种数据长度单位 )
|
运维 分布式计算 监控
Dataphin深度评测:企业级数据中台的智能实践利器
Dataphin是一款以全链路治理、智能提效和高兼容性为核心的企业级数据中台工具,特别适用于中大型企业的复杂数据场景。其流批一体能力、资源监控工具及行业化模板库可显著提升数据治理水平并降低运维成本。通过周期补数据功能,历史数据修复效率提升约60%;智能建模功能使建模时间缩短50%。尽管在数据源支持(如SAP HANA、DB2)和用户体验上仍有改进空间,但其强大的功能使其成为构建企业级数据中台的优选工具,尤其适合零售、金融等行业需要高效数据治理与实时分析的企业。
|
计算机视觉 Python
Hough变换原理-直线检测
Hough变换原理-直线检测
931 2
|
网络安全
LabVIEW崩溃问题解决方法
LabVIEW崩溃问题解决方法
798 0
|
Java Devops 开发工具
DevOps: 使用Maven插件实现分环境配置和版本检查
常用的环境有:dev、sit、uat、sandbox、pro。
890 0
DevOps: 使用Maven插件实现分环境配置和版本检查