對角矩陣
導向
-
了解相關的概念和關鍵詞術語
-
存盤空間的計算
-
前提條件的分析
-
對任意資料的定位
-
代碼實作
1>概念和關鍵詞
概念:對角矩陣又稱是帶狀矩陣,是指在(nxn)的矩陣中非零元素集中在主對角線及其兩側,共L(奇數)條對角線的帶狀區域內,則稱為L對角矩陣,
平行于主對角線的非零元素連成的線稱作帶寬:上三角和下三角各有半帶寬
同時該矩陣的行和列是相同的,所以該矩陣以對角線上下對稱(而且對角線上資料行=列)
2>存盤空間的計算
對矩陣資料的統計=需要存盤的空間(data[masize]),對角矩陣每行資料沒有規律也不便于統計,如果隨著階數的增長統計難度會逐漸加大,即需要一個方便簡潔的統計方法,如果矩陣每一行的資料的數量是一致相同的的那么就會大大減小了統計的難度,
可以對每行進行資料填充但又不影響存盤(可以對每行進行填充零元素,這樣既保證了每行資料相同又不影響資料存盤):
這樣每一行的資料數量都相同,矩陣外的資料不用存盤,
maxsize(一維陣列的數量):每行資料x行數(LxN-2d),第一行和最后一行的零不進行存盤所以要減去(d為半帶寬)
3>前提條件的分析
目的:將矩陣帶狀中的資料存盤到一維陣列中
排序:存盤順序和矩陣順序保存一致
由此可知資料必須在矩陣帶狀中才可以進入一維陣列,則應將帶狀以外的資料全部排除掉
以對角線為界分析可知,下標之差最大為半帶寬,而帶狀之外的資料下標之差已經超過了半帶寬,由此可以利用對角線進行判斷區分資料
Aij 若|i-j|>d則說明資料全部在帶狀以外均為零,不用存盤
若|i-j|<=d則說明資料在帶狀以內是需要存盤的資料,可以對其進行查詢和輸出
4>任意資料的定位
對資料定位的前提條件,定位在帶狀區域內才可以進行定位,若不在則無法定位,所以查詢資料時的判斷條件為資料是否在帶狀區域內
現在假設查詢資料為Aij,資料最侄訓放進一維陣列中,則統計Aij前面共有多少個資料就可以得知Aij在一維陣列中的具體位置,
Aij前有i-1行每行的資料數量為L,則可知道前i-1行的資料數量是(i-1)xL-d
第i行中對角線前的資料有d個(半帶寬的數量)
最后加上j-i即可,綜上可知在第一行減去了一個d個零(掐頭去尾),在第i行中加上了一個d的資料最后抵消
數量=(i-1)xL+j-i//任意資料的位置

5>代碼實作
void main()
{
int array[6][6] = {
{1,3,2,0,0,0},
{2,4,5,7,0,0},
{7,9,2,6,8,0},
{0,2,7,3,2,5},
{0,0,3,9,6,4},
{0,0,0,4,5,1}
};
printf("對角矩陣如下\n");
for (int i = 1; i <=6; i++)
{
for (int j = 1; j <=6; j++)
{
printf("a[%d][%d]=%d ", i, j, array[i - 1][j - 1]);
if (j == 6)
printf("\n");
}
}

區覺得函式,頭檔案math和stdlib都可以
int array1[maxsize];
int k = 0;
for (int i =0;i<6; i++)
{
for (int j = 0;j<6; j++)
{
if (abs(i-j))<=2)
{
array1[k] = array[i][j];
k++;
}
}
}
printf("一維陣列:");
for (int i = 0; i <maxsize; i++)
{
printf("%d ",array1[i]);
}

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/254482.html
標籤:其他
上一篇:開發一款好用的基金助手
下一篇:Swing運用:音樂播放器
