对角矩阵的压缩
什么是对角矩阵
定义:若一个n阶方阵A满足其所有非零元素都集中在以主对角为中心的带状区域中,则称其为n阶对角矩阵(diagonal matrix)。
那么根据以上的定义,我们可以简单的把对角矩阵分为两类:
- 带宽b=1
- 带宽b≠1,且b<n/2
本文目前仅提供b=1时的解法
当b=1时的对角矩阵压缩算法
首先我们构建一个双重循环,用于输入数据,构建我们所需要的对角矩阵
int array[n][n];
for(int i=0;i<n;i++){ //矩阵为n*n
for(int j=0;j<n;j++){
int input;
scanf("%d",&input);
array[i][j]=input;
}
}
我们目前所需要构建的是b=1时的对角矩阵。当b=1时,我们可以得到与下图类似的一个矩阵
\[\left[
\begin{matrix}
a01 & a01 & & & & & \\
& a11 & a12 & a13 & & & \\
& & a22 & a23 &a24 & & \\
& & & a33 & a34 &a35 & & \\
& & & & \ddots & \ddots & \ddots & & & \\
& & & & & a. n .n-1 & a n. n & \\
\end{matrix}
\right]
\]
我们可以看到这个矩阵的大部分空间实际上都是没有内容的,这也是我们对他进行压缩的意义所在。
我们可以看到这个矩阵的第一行和最后一行都只有两个元素,这样首先我们可以知道这个矩阵中的元素总数为:
n=2+3*(n-2)+2=3n-2
我们可以通过定义一个一维数组a[3n-2]来储存我们压缩后的数据内容,我们现在假设ai,j在压缩后数组中的位置为k,则
k=2+3*(i-2)+j-i+1=2i+j-3
若我们在之前已经得到了我们的k,通过换算可以分别得到i,j为
i=(k+1)/3+1
j=k-2i+3
sum=n*3-2;
int a[sum];
for(int k=0;k<sum;k++){
i=(k+1)/3+1;
j=k-2*i+3;
a[k]=array[i][j];
}