三对角矩阵压缩存储--注意对角元素的下标

三对角矩阵压缩存储--注意对角元素的下标

对角矩阵压缩存储
  对角矩阵
是指所有非零元素全部集中在中心几条对角线上的矩阵。下面以三对角矩阵(所有非零元素集中在中心三条对角线上)为例描述对角矩阵压缩存储方法。图2-8是一个三对角矩阵,使用一维数组a[m]来压缩存储矩阵信息,则数组中的元素依次为a11,a12,a21,a22,a23,a32,...,am

  其中,矩阵元素aij下标i、j与其存储在数组中的位置下标k(从0开始计数)存在如下的对应关系:当i=1时,k=j-1(1≤j≤2);当i>1时,k=2×i+j-3(|i-j|≤1)。推导方法如下:
  ① 当i=1时,j的取值就是矩阵元素aij在数组中的存储次序,数组中存储下标为次序减1,故k=j-1。
  ② 当i>1时,在矩阵元素aij之前已经存储了i-1行矩阵元素和第i行的j-i+1个元素,又已知矩阵的第1行需要存储2个元素,第2~i-1行均需要存储3个元素,故矩阵元素aij之前一共存储元素数有2+(i-1-2+1)×3+(j-i+1)=2×i+j-3。故aij的存储下标为2×i+j-3。
  例如,矩阵元素a33存储在一维数组中的位置为k=2×i+j-3=2×3+3-3=6,即一维数组中的第7元素

对角线上方那条有j-i=1,主对角线有j-i=0,下方有j-i=-1,以行为索引 
所以自然可得k=(3i-2)+(j-i);=> k=2i+j-2 
反之当i=j时,k=3i-2=3(i-1)+1,当i=j+1时(下方那条),k=3i-1=3(i-1)+2,当i=j-1时,k=3(i-1) 

所以用k除3取余,设商为x,余为y,y=0则B[k]=a[x+1][x],y=1,B[k]=a[x+1][x+1],y=2,B[k]=a[x+1][x+2]

3.

 i, j   k 
1,0   0 
1,1   1 
1,2   2 

2,1   3 
2,2   4 
2,3   5 

3,2   6 
3,3   7 
3,4   8 
k   =   (i+j)+(i-2)   =   2*i+j-2 
i   =   k/3取整+1 
j   =   k/3取整+k%3

 

三对角矩阵是指除了对角线和相邻的两条副对角线以外,其余元素均为0的矩阵。在压缩存储方面,可以将该矩阵中的非零元素按行存储在一个一维数组里,同时在数组前后各增加一个0,表示矩阵中不存在的元素。 以下是使用C语言实现三对角矩阵压缩存储的代码: ``` #include <stdio.h> #include <stdlib.h> #define MAXSIZE 100 // 数组最大长度 int main() { int n; // 矩阵大小 int a[MAXSIZE], b[MAXSIZE], c[MAXSIZE], d[MAXSIZE]; // 存储矩阵元素和压缩后的数据 int i, j; // 读入矩阵大小和元素 printf("请输入矩阵大小:"); scanf("%d", &n); for (i = 1; i <= n; i++) { scanf("%d", &d[i]); // 对角线元素 if (i > 1) { scanf("%d", &c[i-1]); // 上对角线元素 } if (i < n) { scanf("%d", &b[i]); // 下对角线元素 } } // 压缩存储 a[1] = b[n] = 0; // 第一个和最后一个元素为0 for (i = 2; i <= n; i++) { a[i] = d[i-1]; } for (i = 1; i <= n-1; i++) { c[i] = c[i] / d[i]; d[i+1] = d[i+1] - c[i]*b[i]; } for (i = 2; i <= n; i++) { a[i] = a[i] - c[i-1]*a[i-1]; } // 输出压缩后的数据 printf("压缩后的数据为:\n"); for (i = 1; i <= n; i++) { printf("%d ", a[i]); } printf("\n"); for (i = 1; i < n; i++) { printf("%d ", d[i+1]); } printf("\n"); for (i = 1; i < n; i++) { printf("%d ", b[i]); } printf("\n"); return 0; } ``` 上述代码中,输入的三对角矩阵元素存储在数组d、b和c中,压缩后的数据存储在数组a、d和b中,数组下标从1开始。程序在输出压缩后的数据时,先输出a数组中的所有元素,再输出d和b数组中的元素
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值