带状矩阵即在矩阵A中,所有的非零元素都集中在以主对角线为中心的带状区域中。
带状矩阵即在矩阵A中,所有的非零元素都集中在以主对角线为中心的带状区域中。
对于n*n的方阵,若它的全部非零元素落在一个以主对角线为中心的带状区域中,这个带状区域包含主对角线, 以及主对角线下面及上面各b条对角线上的元素,那么称该方阵为半带宽为b的带状矩阵。
带状矩阵的特点是:对于矩阵元素a(i,j)!=0,|i-j|<=b。
带状矩阵的存储空间为(2*b+1)*n-2*b。2*b+1为每一行所需空间,所以乘以n行,又因为第一行和最后一行之分配b+1个空间,所以公式中要减去2倍的2*b+1-(b+1)=b。
address(a(i,j))=1+(i*(2*b+1)-b)+(j-i+b)=1+(i*(2*b+1)+j-i)。我把书中的公式做了修改,address(a(i,j))=1。红色字体表示元素所在行之前的元素个数。每一行有2*b+1个元素,之前有i行,由于第一行并没有2*b+1个元素,所以要减去b个。
n阶矩阵A称为带状矩阵,如果存在最小正数m ,满足当∣i-j∣ ≥ m 时,aij =0,这时称 w=2m-1 为矩阵A的带宽;
亦可表述为:对于n阶对称矩阵A,若存在最小正数m,使j > i+m时,aij =0,这时称 w=2m+1 为矩阵A的带宽。
带状矩阵指矩阵中所有的非零元素都集中在以对角线为中心的带状区域中,这里以最常见的三对角带状矩阵为例,示例代码:
#include <stdio.h>#include <stdlib.h>#define N 100int a, sa;int main(void){ int i, j, k; int n, m; printf("请输入矩阵的行数和列数: "); scanf("%d%d", &n, &m); printf("请输入一个带状矩阵(所有非零元素都集中在以对角线为中心的带状区域):n"); for(i = 1; i <= n; i++) for(j = 1; j <= m; j++) scanf("%d", &a); for(i = 1; i <= n; i++) for(j = i-1; j <= i+1; j++) sa = a; printf("Loc=Loc+前i-1行非零元素个数+第i行中a前非零元素个数n"); printf("前i-1行非零元素个数=3*(i-1)-1 (-1因为第一行只有两个非零元素)n"); printf("第i行中a前非零元素个数=j-i+1n"); printf("由此可得:nLoc=Loc+3*(i-1)-1+j-i+1=Loc+2(i-1)+j-1n"); printf("即 sa] = ann"); printf("sa中的数据为: n"); for(i = 1; i <= 1+2*(n-1)+m-1; i++) printf("sa = %dn", i, sa); printf("n其对应关系为:n"); for(i = 1; i <= n; i++) for(j = i-1; j <= i+1; j++) if(sa != 0) printf("a = sa = %dn", i, j, 1+2*(i-1)+j-1, sa); return 0;}