對稱矩陣
主要分享對特殊矩陣中對稱矩陣的壓縮存盤,如果其中有一些錯誤請多多包涵,
1>什么是對稱矩陣
對稱矩陣是一種特殊的矩陣:其資料沿著對角線對稱(沿著對角線一一對稱)
這里涉及到線性代數其中的一個概念,如果一個矩陣的轉置矩陣對于自身則該矩陣為對稱矩陣
同時對稱三角形對稱矩陣以對角線為分界線可分為上三角和下三角
2>壓縮存盤的必要性
矩陣和陣列的聯系:
線性代數上的矩陣等價于資料結構中的陣列,例如A=[1,2,3,4,5,6]這是一個1x6的矩陣同時也是一個一維陣列,同理就會有二維陣列三維陣列一直到n維陣列分別對于矩陣
對稱矩陣的必定滿足行=列,要不然無法滿足對稱條件
存盤方式
在計算機中對于一階矩陣我們就會開辟一個一維陣列去存盤(相對簡單便利),但是隨著階數的增加如果我們再去開辟同樣維數的地址空間那么系統存盤的代價就會很大,所以我們要進行壓縮矩陣去存盤(這里的壓縮并不是丟失資料)
所以綜上我們可以得到要盡可能的去減少記憶體的占有同時盡可能的提高記憶體的利用率,則對于這種特殊矩陣是可以進行處理達到以最少的記憶體去存盤(以對角線為分界線存盤一半的資料就可以存盤整個矩陣的資料在根據對稱可以存盤每個位置的資料)
3>分析步驟
陣列占用地址=資料數目*資料型別大小 (可以通過sizeof函式得到資料型別的大小)
對稱矩陣有兩種排列方式: 1 按照行序進行排列(一行存滿在轉到下一行) 2 按照列進行排列(一列存滿在轉到下一列)
按照行進行排列(假設有矩陣Dnxn,其中下標從1開始)//矩陣中下標多從1開始,陣列中以0開始
先不考慮資料對應問題,我們假設現將xia三角資料全部放到一維陣列中,所以需要考慮三個因素:陣列的長度、如何定位資料(比如Aij)、如何將下三角元素表達
陣列長度:
需要計數上三角中所有資料的個數,
第一行a11(1個資料)
第二行a21-->a22 (2個資料)
.....
第n行an1--->ann(n個資料)
綜上課只下三角共有資料數量:1+2+3.....+n=[n(n+1)/2]-1=maxsize,這就是我們開辟一維陣列資料的總長度也就是data[maxsize]
同理就可以計算任意點的位置
定位資料(比如Aij)
第一行a11(1個資料)
第二行a21-->a22 (2個資料)
.....
第i-1行a(i-1)1--->a(i-1)n(i-1個資料)
位置:1+2+3.....+i-1+j=[i(i-1)/2]+j-1
所以就完成了對陣列maxsize和對任意位置的定位
下三角元素表達
這個可以根據對稱原理:Aij=Aji,即可完成對下三角資料的表達和保存
同理如果是按列進行存盤只需要將公式中的i換成j即可
4>代碼實作
這里實作是按行存盤在下三角型的情況
定義一個4階的矩陣
int array[4][4] = {
{1,2,3,4},
{2,9,4,5},
{3,4,0,6},
{4,5,6,3},
};
printf("對稱矩陣如下\n");
for (int i = 1; i <=4; i++)
{
for (int j = 1; j <=4; j++)
{
printf("a[%d][%d]=%d ", i, j, array[i-1][j-1]);
if (j == 4)
printf("\n");
}
}

賦值并且輸出一維陣列:
for (int k = 0; k < maxsize ; k++)
{
for (int i = 1; i <=4; i++)
{
for (int j = 1; j <=4; j++)
{
if (i*(i - 1) / 2 + j - 1 == k)
{
array1[k] = array[i - 1][j - 1];
}
}
}
}
printf("一維陣列:");
for (int i = 0; i < maxsize; i++)
{
printf("%d ",array1[i]);
}

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/254070.html
標籤:其他
上一篇:二進制學習01(二進制,進制運算,資料寬度,無符號位有符號位編碼規則)
下一篇:電子類專業的畢業后就業方向
