关于对角矩阵压缩存储的分析

对角矩阵是一种非零元素集中在注对角线为中心的带状区域的矩阵,对其进行压缩,有利于减少存储空间,保证存储空间利用效率。

现有一个A[n][n]的矩阵(是一个大小为n的方阵),该矩阵从A[0][0]开始存放,现将该矩阵压缩至一维数组sa[]中,从sa[0]开始存储。假设宽度为d(指主对角线右侧或左侧有多少平行于主对角线的斜行)注意:2*d+1<=n,矩阵中的元素存放至sa[]中按行存放。k为sa存放的下标。

假设该元素在数组A中所在的位置为A[i][j],它前面存在i行,若没有矩阵限制,前面有(2*d+1)*i个元素,而去掉的个数与i,d有关,从行标0开始到d-1结束,每行分别减去的d,d-1,..1;从行标n-d到n-1,分别减去1,2,...d  注意:减的是i行前面一行多算了的,不要把该行最后多算的元素也减掉  再看它所在的行i,A[i][j]前有几个数与i和d有关,若i>=d,则是该行的第j-i+d+1个,若i<d,则是该行的第j+1个,因为从sa[0]开始存放,总数要-1。

由上述分析可知:

 

if (i<d)

k=(2*d+1)*i-i*(2*d-i+1)/2+j;

else

k=(2*d+1)*i-(1+d)*d/2+j-i+d;

if(i>n-d)

k=k-(1+i-n+d)*(i-n+d)/2;

 

例如:

红色为非零元素,蓝色为自己添加的元素,便于计算。

如图n=5,d=3,i=3,j=3

算蓝色区域即(2*d+1)*i(即21),因为i>=d,再减绿色区域(1+d)*d/2(即 6),加上紫色下划线部分j-i+d(即3),因为i>n-d,再减去红色区域部分(1+i-n+d)*(i-n+d)/2(即1)得到下标k=17。

posted @ 2020-10-21 20:35  巧巧123  阅读(435)  评论(0)    收藏  举报