![MATLAB R2020a完全自学一本通](https://wfqqreader-1252317822.image.myqcloud.com/cover/483/34667483/b_34667483.jpg)
3.5 稀疏矩阵
在许多问题中提到了含有大量0元素的矩阵,这样的矩阵称为稀疏矩阵。为了节省存储空间和计算时间,MATLAB考虑到矩阵的稀疏性,在对它进行运算时有特殊的命令。
一个稀疏矩阵中有许多元素等于零,这便于矩阵的计算和保存。如果MATLAB把一个矩阵当作稀疏矩阵,那么只需在m×3的矩阵中存储m个非零项。第1列是行下标,第2列是列下标,第3列是非零元素值,不必保存0元素。如果存储每个浮点数需要8字节,存储每个下标需要4字节,那么整个矩阵在内存中存储需要16×m字节。
例3-51:稀疏矩阵与普通矩阵示例。
在命令行窗口中输入:
![img](https://epubservercos.yuewen.com/C258E9/18519308401625406/epubprivate/OEBPS/Images/txt005_133.jpg?sign=1738829899-EGksTgAmVDD02zRAJa37cqxRv9ipPZjU-0-98c4ed4f06c32951c09cf06edf46afc1)
上例中的矩阵A存储需要8MB空间,而稀疏矩阵B存储只需16KB空间,其所需空间只是单位矩阵的0.2%。对于许多的广义矩阵也可这样来做。
前面章节中的算术运算和逻辑运算都适用于稀疏矩阵。而相对于普通矩阵来说,稀疏矩阵的计算速度更快,因为MATLAB只对非零元素进行操作,这是稀疏矩阵第二个突出的优点。例如,在上例中,2∙A需要100万次浮点运算,而计算2∙B只需要2000次浮点运算。因为MATLAB不能自动创建稀疏矩阵,所以要用特殊的命令来得到稀疏矩阵。
稀疏矩阵大部分元素是0,因此只需存储非零元素的下标和元素值,这种特殊的存储方式可以节省大量的存储空间和不必要的运算。
3.5.1 稀疏矩阵的存储方式
对于稀疏矩阵,MATLAB仅存储矩阵所有的非零元素的值及其位置(行号和列号)。显然,这对于具有大量0元素的稀疏矩阵来说是十分有效的。
设矩阵是具有稀疏矩阵特征的矩阵,其完全存储方式是按列存储的全部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 稀疏矩阵的指令集
![img](https://epubservercos.yuewen.com/C258E9/18519308401625406/epubprivate/OEBPS/Images/txt005_135.jpg?sign=1738829899-9VZorQYTb6IAcGQ631OWFglOG62kVrF3-0-3e8b45bc51917f762939f7ff50e0c371)
例3-52:输入一个稀疏矩阵示例。
在命令行窗口中输入:
![img](https://epubservercos.yuewen.com/C258E9/18519308401625406/epubprivate/OEBPS/Images/txt005_136.jpg?sign=1738829899-oS4nmH8hxjVVMzBTrDvhEGZsWUfPPZVn-0-289a28d4bc8f15ec10e7b74af753a2ad)
结果如下:
![img](https://epubservercos.yuewen.com/C258E9/18519308401625406/epubprivate/OEBPS/Images/txt005_137.jpg?sign=1738829899-rxJwvz9GDXcTs1n0n2pHXtYFCYqWSd1K-0-9359d1270eb07f3909d635fbf904e2ef)
此外,sparse函数还可以将一个满矩阵转换成一个稀疏矩阵,相应的调用格式如下。
● S=sparse(X):X为满矩阵。
例如矩阵A=,
输入命令:
![img](https://epubservercos.yuewen.com/C258E9/18519308401625406/epubprivate/OEBPS/Images/txt005_139.jpg?sign=1738829899-MUBPLAgPgmzfjZvc7G7qBr3pQ2S3CdX6-0-4acf1f7ce675cc3fdfecca2b06dfc46f)
得到结果如下:
![img](https://epubservercos.yuewen.com/C258E9/18519308401625406/epubprivate/OEBPS/Images/txt005_140.jpg?sign=1738829899-N1smM0pCe5CaqzuhJjtm7z1DZq0MdMCn-0-4ed4b9204f6532041c93463e4042e26f)
反之,MATLAB中提供了full()函数把稀疏矩阵转换为满矩阵。full()函数的调用格式如下。
● A=full(S):S为稀疏矩阵。
例如将上例中得到的稀疏矩阵S转换为满矩阵。
输入命令:
![img](https://epubservercos.yuewen.com/C258E9/18519308401625406/epubprivate/OEBPS/Images/txt005_141.jpg?sign=1738829899-fNjfcYjaWECB0ML741PvXEsDuTNiD3ON-0-177c3799ea1370865b99fbd65239d328)
得到结果如下:
![img](https://epubservercos.yuewen.com/C258E9/18519308401625406/epubprivate/OEBPS/Images/txt005_142.jpg?sign=1738829899-Bvb11WCuh1Ei8fDhYpY0SEJJ5TlXlApK-0-0c69a557e558ac385ca6076a8283994d)
例3-53:将普通矩阵转换为稀疏矩阵示例。
在命令行窗口中输入:
![img](https://epubservercos.yuewen.com/C258E9/18519308401625406/epubprivate/OEBPS/Images/txt005_143.jpg?sign=1738829899-nCFQHbSsKGDRs9QyajGYz4FCa87lvU7O-0-99d5f45b813385c8aa886c826783a1c5)
输出结果:
![img](https://epubservercos.yuewen.com/C258E9/18519308401625406/epubprivate/OEBPS/Images/txt005_144.jpg?sign=1738829899-EzGsoOwDv0R9Cpzlrp3WajV0rPHmhnU9-0-baf161faf74ac230fe89bebb36ac2fbd)
例3-54:查看稀疏矩阵中非零元素的信息示例。
在命令行窗口中输入:
![img](https://epubservercos.yuewen.com/C258E9/18519308401625406/epubprivate/OEBPS/Images/txt005_145.jpg?sign=1738829899-ktrrbMXHiZbzAUXiPt5pfm8vOWfzPB5x-0-faa689b2b02947f4fa01eab2de82e358)
输出结果:
![img](https://epubservercos.yuewen.com/C258E9/18519308401625406/epubprivate/OEBPS/Images/txt005_146.jpg?sign=1738829899-2GC0mTykjWWASMRtNLNi2WsVzxebE0tp-0-5862986f73c52658a31d1d1890baac7e)
利用spy()函数可以对稀疏矩阵中非零元素的分布进行图形化显示,如图3-4所示。采用nnz(S)/prod(size(S))计算稀疏矩阵的非零元素密度。
![img](https://epubservercos.yuewen.com/C258E9/18519308401625406/epubprivate/OEBPS/Images/txt005_147.jpg?sign=1738829899-Y4MiAV3ivlGcxZ9y1helzRpuqv1VqOzv-0-11d92b8f9f938ffeeccc64161cc1a05a)
图3-4 稀疏矩阵中非零元素的分布的图形化显示
2.利用特定函数创建特殊稀疏矩阵
MATLAB中提供了一些函数来创建特殊的稀疏矩阵,这些函数如表3-5所示。
表3-5 特殊稀疏矩阵的创建函数
![img](https://epubservercos.yuewen.com/C258E9/18519308401625406/epubprivate/OEBPS/Images/txt005_148.jpg?sign=1738829899-Sv1r4IQL9DtAWVI06smWpomOexY7x1Sg-0-74307455a55b2b8bd8ff16bed88938a2)
续表
![img](https://epubservercos.yuewen.com/C258E9/18519308401625406/epubprivate/OEBPS/Images/txt005_149.jpg?sign=1738829899-a4eW9XX2aH8BuIFoLTPqoMcY3puBlT47-0-657fc1b2e1a24511fd906aa4b9d9bdc8)
例3-55:利用speye函数创建单位稀疏矩阵示例。
在命令行窗口中输入:
![img](https://epubservercos.yuewen.com/C258E9/18519308401625406/epubprivate/OEBPS/Images/txt005_150.jpg?sign=1738829899-eyfh5HGgGp5Bk9d0b2IQ2mnbT3JazpaP-0-3c895384730b3e4d7d4c6a7483d9d567)
输出结果:
![img](https://epubservercos.yuewen.com/C258E9/18519308401625406/epubprivate/OEBPS/Images/txt005_151.jpg?sign=1738829899-pUechdOWkaoUnfaYi8zN8ZdZHWYXtPc3-0-9753854dc3edb601c1be14c483f9442f)
例3-56:创建非零元素为随机数的对称稀疏矩阵示例。
在命令行窗口中输入:
![img](https://epubservercos.yuewen.com/C258E9/18519308401625406/epubprivate/OEBPS/Images/txt005_152.jpg?sign=1738829899-8x3r9DufbTWnpliphHBAACmPEnDy0P3m-0-2d38d764228c479fa895113f15bb742c)
输出结果:
![img](https://epubservercos.yuewen.com/C258E9/18519308401625406/epubprivate/OEBPS/Images/txt005_153.jpg?sign=1738829899-lTh3ZmFUyLJM5GKQoBDJIaNabMnnVkfl-0-1d9a31321ac26291f86a8b7d22c40ee8)
3.5.3 稀疏矩阵的运算
满矩阵的四则运算对稀疏矩阵同样有效,但是返回结果有可能是稀疏矩阵或满矩阵。
对于单个稀疏矩阵的输入,大部分函数输出的结果都是稀疏矩阵,有部分函数输出的结果是满矩阵。对于多个矩阵的输入,如果其中至少有一个矩阵是满矩阵,那么大部分函数的输出结果是满矩阵。
对于矩阵的加、减、乘、除运算,只要其中有一个矩阵是满矩阵,则输出的结果都是满矩阵。
稀疏矩阵的数乘为稀疏矩阵;稀疏矩阵的幂为稀疏矩阵。