第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帮助文件等。


相关文章
|
12天前
使用多维数组将两个矩阵相加
【10月更文挑战第30天】使用多维数组将两个矩阵相加。
24 2
|
4月前
|
存储 算法 Python
稀疏矩阵是矩阵中大部分元素为零的矩阵。
稀疏矩阵是矩阵中大部分元素为零的矩阵。
|
存储 机器学习/深度学习 算法
稀疏矩阵
稀疏矩阵是一种特殊形式的矩阵,其中大部分元素都是零。与密集矩阵相比,稀疏矩阵在存储和计算时可以采用特殊的算法和数据结构,以提高计算效率和节省存储空间。
110 3
|
6月前
|
机器学习/深度学习 存储 人工智能
利用前缀和计算二维矩阵子矩阵的和
利用前缀和计算二维矩阵子矩阵的和
66 0
|
机器学习/深度学习 存储 人工智能
第3章 数组与矩阵——3.2 矩阵操作
第3章 数组与矩阵——3.2 矩阵操作
|
机器学习/深度学习 资源调度 算法
第3章 数组与矩阵——3.4 矩阵运算(2)
第3章 数组与矩阵——3.4 矩阵运算(2)
|
机器学习/深度学习 前端开发 rax
第3章 数组与矩阵——3.4 矩阵运算(1)
第3章 数组与矩阵——3.4 矩阵运算(1)
第3章 数组与矩阵——3.3 矩阵元素的运算(1)
第3章 数组与矩阵——3.3 矩阵元素的运算(1)
第3章 数组与矩阵——3.3 矩阵元素的运算(2)
第3章 数组与矩阵——3.3 矩阵元素的运算(2)
|
人工智能 Java 算法框架/工具
二维前缀和数组&二维差分数组
二维差分数组div中的每一个格子记录的是「以当前位置为区域的左上角(区域右下角恒定为原数组的右下角)的值的变化量」【应该不固定 可以倒转】
357 0
二维前缀和数组&二维差分数组