本篇博客主要是关于对角矩阵压缩存储为一维数组,我们以三对角矩阵为例(ps:通篇对角矩阵存储在二维数组,一维数组的初始下标都是从0开始的)
三对角矩阵:它“几乎”是一个对角矩阵。一个三对角矩阵的非零系数分布在主对角线以及两边的线上,呈带状分布,其余的位置元素的值都是0。例如下图:
如果将此三对角矩阵通过二维数组的方式进行存储,有许多0元素,这必然会浪费较多空间,所以我们来探讨是否可以通过一维数组的方式来压缩存储,从而尽可能利用更多空间
通过观察图1,我们可以看出三对角矩阵除去首行和尾行分别有2个非0元素,其余行都是3个非0元素。
如果没有看出来可以看看下面这个
依旧可以得出结论:三对角矩阵除去首行和尾行分别有2个非0元素,其余行都是3个非0元素。
所以通过这个我们可以进一步进行分析
首先非0元素的个数:有(n-2)行3个非0元素 ,首尾两个元素,所以个数有 3*(n-2)+2*2=3*n-2。
其次压缩存储为一维数组的关键是一维数组的下标k值
在 i 行 j 列的k值:
可以先考虑前 i 行(不包括 i 行)有多少非0元素,据图可得有(i-1)*3+2 个元素,其中2是第一行非0元素的个数,3是指每行非0元素个数。
然后再考虑第 i 行被选中的元素的位置,根据主对角线可以先确定中间元素在该行的位置,要么是(i-j)+1,要么就是(j-i)+1。这里可以利用该行其余两个非0元素的位置得出第i行被选中的元素的位置(j-i)+1。
所以k =(i-1)*3+2+(j-i)+1=2*i+j
所以利用k可以推导出二维数组i,j的值,i=(k+1)/3(当k=2时,i=1;当k=5时,i=2;当k=8时,i=3;则可以推导k=3*i-1)
j=k-2*i(通过k=2*i+j推导);
所以根据中间非0元素有3 个就可以轻松得出k的值,然后可以进一步推导。
其余的对角矩阵也可以通过此类方式推理出来
下面附部分代码和运行结果
以上就是我对 对角矩阵压缩储存一维数组的理解与思考,谢谢观看!