关于对角矩阵压缩存储的分析
对角矩阵是一种非零元素集中在注对角线为中心的带状区域的矩阵,对其进行压缩,有利于减少存储空间,保证存储空间利用效率。
现有一个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。

浙公网安备 33010602011771号