对角矩阵的压缩

什么是对角矩阵

定义:若一个n阶方阵A满足其所有非零元素都集中在以主对角为中心的带状区域中,则称其为n阶对角矩阵(diagonal matrix)。

那么根据以上的定义,我们可以简单的把对角矩阵分为两类:

  1. 带宽b=1
  2. 带宽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];
    }
posted @ 2020-10-22 20:27  柳暮云  阅读(193)  评论(0)    收藏  举报