更新时间:2022-08-25 15:30
在矩阵中,若数值为0的元素数目远远多于非0元素的数目,并且非0元素分布没有规律时,则称该矩阵为稀疏矩阵;与之相反,若非0元素数目占大多数时,则称该矩阵为稠密矩阵。定义非零元素的总数比上矩阵所有元素的总数为矩阵的稠密度。
矩阵中非零元素的个数远远小于矩阵元素的总数,并且非零元素的分布没有规律,通常认为矩阵中非零元素的总数比上矩阵所有元素总数的值小于等于0.05时,则称该矩阵为稀疏矩阵(sparse matrix),该比值称为这个矩阵的稠密度;与之相区别的是,如果非零元素的分布存在规律(如上三角矩阵、下三角矩阵、对角矩阵),则称该矩阵为特殊矩阵。
比较基本的定义是矩阵中的大多数元素为零,并且可以利用零元素节约大量存储、运算和程序运行时间。
稀疏矩阵几乎产生于所有的大型科学工程计算领域,包括计算流体力学、统计物理、电路模拟、图像处理、纳米材料计算等。
最常用的稀疏矩阵存储格式为列压缩存储(compressedcolumn storage,CCS) 或行压缩存储( ompressedrow storage,CRS)。
以CCS 格式为例,一个 阶包含 nnz 个非零元的稀疏矩阵需要用列指针、行指标和非零值三个一维数组表示,其中 nnz 维非零值数组按列记录所有非零元素,同样维数的行指标记录每列非零元所在的行,n+1 维的列打针向量记录每一列(包括 n+1 列) 的开始位置。还有三元组表和链接存储等其他格式等。
符号稀疏矩阵(symbolic sparse matrix) 只需列指针和行指标两个数组。此外,稀疏向量是稀疏矩阵的特例,只需用指标和非零值两个数组表示,最近在电路、电子结构等领域得到越来越多的重视。
稀疏矩阵的计算速度更快,因为 MATLAB 只对非零元素进行操作,这是稀疏矩阵的一个突出的优点。
假设矩阵 A,B 中的矩阵一样,计算 2*A 需要一百万次的浮点运算,而计算 2*B 只需要 2000 次浮点运算。
因为 MATLAB 不能自动创建稀疏矩阵,所以要用特殊的命令来得到稀疏矩阵。算术和逻辑运算都适用于稀疏矩阵。
对于一个用二维数组存储的稀疏矩阵 Amn ,如果假设存储每个数组元素需要 L 个字节,那么存储整个矩阵需要 m*n*L 个字节。但是,这些存储空间的大部分存放的是 0 元素,从而造成大量的空间浪费。为了节省存储空间,可以只存储其中的非 0 元素。
对于矩阵 Amn 的每个元素 aij ,知道其行号 i 和列号 j 就可以确定其位置。因此对于稀疏矩阵可以用一个结点来存储一个非 0 元素。该结点可以定义:[i,j,aij]。该结点由3个域组成,i:行号,j:列号,aij:元素值。
这样的结点被称为三元组结点。矩阵的每一个元素 Qij,由一个三元组结点 (i,j,aij) 唯一确定。
稀疏矩阵和稠密向量的乘积运算等相对容易实现。稀疏矩阵和稠密向量的高性能运算类似,它可以通过对行列的适当排序实现,其中块操作起着至关重要的作用。
对稀疏矩阵结构的操作则比较复杂,和排序、消去数等图论技巧关系密切,比如稀疏矩阵的求和与三角分解会产生填充(fill-in),两个稀疏矩阵的乘积的高效实现至今仍是一个具有挑战性的问题。另一方面,稀疏矩阵运算,比如三角分解,还要考虑数值稳定性问题,稀疏性和数值稳定性往往是一对矛盾。
有些应用问题,尤其是有限元离散化得到的稀疏矩阵,往往具有非常特殊的结构,在区域和网格均匀等条件下可以实现快速算法。