写在前面:作者本人是纯纯的菜鸟,学习的内容来自于 中国大学MOOC 中南大学 《科学计算与MATLAB语言》,欢迎各位大佬或新手在这里和平讨论,如果我有错误请各位不吝赐教,提前感谢各位捧场!
什么是稀疏矩阵?
一个零元素个数远远多于非零元素个数的矩阵。对于这样的矩阵,若将零元素也存储起来则会浪费计算机储存空间,因此对这样的矩阵还专门开发了稀疏存储方式。
一、矩阵的存储方式
1.完全存储方式(直到这篇文章以前我举的所有例子基本都是使用了完全存储方式)
2.稀疏存储方式:只存储非零元素对应的行列号以及这个数字的值。
注:采用稀疏存储方式时矩阵储存顺序并没有改变,仍然按列排列。
二、建立稀疏存储方式
方法一:完全存储方式和稀疏存储方式的转化:
a.完全->稀疏:A=sparse(S) 将矩阵S转化为稀疏存储方式储存于A中。
b.稀疏->完全:S=full(A) 将矩阵A转换为完全存储方式储存于S中。
但如果一个矩阵本身非常大,无法通过线完全存储再进行转化的方式稀疏存储,则又要找到别的办法了。
方法二:直接建立稀疏存储方式
情况一:纯纯的稀疏矩阵
a.使用sparse()函数,此时需要使用其他两种调用格式:
sparse(m,n)
%建立m行n列全零矩阵,经过我的实验,与使用zeros函数有一丝丝区别,见下图
sparse(u,v,S)
%u(i),v(i)分别是行列下标
%S(i)是非零元素的值
zeros函数和sparse(m,n)函数产生零矩阵的区别
在进行A==B的运行,会生成一个全1矩阵,说明这两个矩阵是完全一样的,也就是说这个稀疏矩阵稀疏的只想写汉字表示这个5*6矩阵全是0了。。
b.使用spconvert()函数
B=spconvert(A)
%A是一个m*3或m*4矩阵,m是非零元素个数
%A(i,1)表示该元素的行号
%A(i,2)表示该元素的列号
%A(i,3)表示该元素的实部
%A(i,4)表示该元素的虚部(若不写则表示没有虚部)
情况二:带状系数矩阵
带状稀疏矩阵:所有非零元素都在对角线上(别忘记矩阵对角线有很多,对角线还有命名规定哦)
存储方式:
[B,d]=spdiags(A)
%从带状稀疏矩阵中提取全部非零对角线元素赋给矩阵B,并将对应的对角线序号储存至向量d
A=spdiags(B,d,m,n)
%m,n表示A矩阵的行列数
如图,带状稀疏矩阵存储方式是(个人理解):B的行数为最长对角线的元素个数(这个接下来我做了实验证明),主对角线以下的对角线的元素存储进入B的对应列会先补0再填写非零元素;相反的,在主对角线以上的元素储存时会先写非零元素再补0.
如图,对于这个A矩阵,主对角线元素全为0,储存时B矩阵仍保持3行。
情况三:单位矩阵的系数存储
speye(m,n)
%稀疏存储一个m行n列的单位矩阵
%当然,若产生单位方阵可以省略n
以上就是今天分享的全部内容了,再次感谢各位耐心看到这里!