帶狀矩陣即在矩陣A中,所有的非零元素都集中在以主對角線為中心的帶狀區域中。
基本介紹
- 中文名:帶狀矩陣
- 外文名:Band matrix
- 學科:數學
詳解,帶狀矩陣的頻寬,帶狀矩陣的代碼描述,
詳解
對於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[N][N], sa[N*N];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[i][j]); for(i = 1; i <= n; i++) for(j = i-1; j <= i+1; j++) sa[1+2*(i-1)+j-1] = a[i][j]; printf("Loc[i,j]=Loc[1,1]+前i-1行非零元素個數+第i行中a[i][j]前非零元素個數\n"); printf("前i-1行非零元素個數=3*(i-1)-1 (-1因為第一行只有兩個非零元素)\n"); printf("第i行中a[i][j]前非零元素個數=j-i+1\n"); printf("由此可得:\nLoc[i,j]=Loc[1,1]+3*(i-1)-1+j-i+1=Loc[1,1]+2(i-1)+j-1\n"); printf("即 sa[Loc[i,j]] = a[i][j]\n\n"); printf("sa[]中的數據為: \n"); for(i = 1; i <= 1+2*(n-1)+m-1; i++) printf("sa[%d] = %d\n", i, sa[i]); printf("\n其對應關係為:\n"); for(i = 1; i <= n; i++) for(j = i-1; j <= i+1; j++) if(sa[1+2*(i-1)+j-1] != 0) printf("a[%d][%d] = sa[%d] = %d\n", i, j, 1+2*(i-1)+j-1, sa[1+2*(i-1)+j-1]); return 0;}