資料結構 特殊矩陣的儲存壓縮及解壓

2021-10-08 22:59:43 字數 4793 閱讀 7859

特殊矩陣的儲存壓縮及解壓

#define _crt_secure_no_warnings

#define empty_queue_error -999999

#include

#include

#include

#include

#include

#define maxlen 100

typedef

int elemtype;

//形如對稱矩陣、三角矩陣等特殊形式的矩陣,只需儲存其中的部分元素即可,稱為「壓縮儲存」。關鍵是建立矩陣中元素的 行列 索引與 一維陣列 儲存空間 索引之間的關聯關係。

//(17)對稱矩陣

//(18)矩陣結構體的定義

//定義乙個壓縮矩陣的結構體型別,用一維陣列來儲存矩陣中的元素。為了簡單起見,令矩陣為dim* dim的方陣。其中,dim為一確定的整數大小。

#define maxlen 100

#define dim 4

typedef

struct

intcompressedmatrix;

/*壓縮矩陣就是由乙個矩陣壓縮成一維陣列,而非一般意義的矩陣*/

/*matrix /'meɪtrɪks/n.矩陣*/

/*(19)對稱矩陣的初始化與讀取

用乙個對稱矩陣(定義為m[dim][dim]) 來初始化(填充) 該壓縮矩陣

壓縮:*/

void

initsmatrix

(intcompressedmatrix* pmat,

int m[dim]

[dim]

)//該函式正確.

// 讀取(對稱矩陣的壓縮矩陣中解壓出來(一次乙個元素),將值儲存到x中.)

intget

(intcompressedmatrix* pmat,

int i,

int j,

int* x)

/* 給x賦值

由於只儲存了i>=j的下三角,如果欲讀取j>i的上三角元素,怎麼讀取?*/

if(i >= j)

*x = pmat->elem[

(i-1)*

((i-1)

+1)/

2+ j -1]

;else

*x = pmat->elem[

(j -1)

*((j -1)

+1)/

2+ i -1]

;return1;

}//函式已修正.

/*(20)三角矩陣的訪問(重複元素集中在某一側)("三角"分為上三角和下三角)

對三角矩陣進行壓縮儲存,寫出與上述對稱矩陣類似的 結構體和操作函式。*/

intinitsmatrix_********_down

(intcompressedmatrix* pmat,

int(

*m)[dim]

)printf

("\n");

} pmat->elem[0]

= m[0]

[dim -1]

;}/*傳入原始矩陣的任意位置(i,j)*/

intget_********_down

(intcompressedmatrix* pmat,

int i,

int j,

int*x)

int subscript_row = i -1,

subscript_col = j -1;

if(i >= j)

else

return1;

/*讀取成功*/

}/*分析上三角:(記憶體迴圈收縮左邊界)*/

/*將上三角矩陣壓縮到pmat矩陣(或者說一維陣列)中*/

intinitsmatrix_********_up

(intcompressedmatrix* pmat,

int m2_2[

][dim]

)printf

("\n");

} pmat->elem[0]

= m2_2[dim-1]

[0];

}/*解壓公式:f(i,j) = (i-1)*row+j -(i-1)*((i-1) + 1) / 2;*/

/*引數變數x是原矩陣中的元素,對映f(i,j)求得的是原矩陣中(i,j)位置的元素在壓縮矩陣中的下標值.*/

intget_********_up

(intcompressedmatrix* pmat,

int i,

int j,

int* x)

if(i<=j)

else

return1;

}/*(21)對角矩陣的訪問(重複元素分布在對角線兩側)(一般說明是n對角矩陣)

對 對角矩陣進行壓縮儲存,寫出與上述對稱矩陣類似的結構體和操作函式。*/

//對角矩陣的重複元素儲存在陣列的第[0]位置上.

/*對角矩陣的壓縮沒有涉及公式*/

intinitsmatrix_tri_diagonal

(intcompressedmatrix* pmat,

int(

*m3)

[dim]

)/*diagonal /daɪ'æɡənl/ adj.對角線的, 斜的,*/

pmat->elem[index++

]= m3[i -1]

[j -1]

;/*i,j的取值控制由兩重迴圈實現控制,到訪問陣列元素前,位置參量i,j都是從1開始,在訪問時均減去1再訪問.*/

printf

("%d "

, pmat->elem[index -1]

);}//for

printf

("\n");

}//for

pmat->elem[0]

= m3[0]

[dim -1]

;}/*解壓對三角矩陣,從elem陣列中解壓出來.(訪問指定的原矩陣中的第i行,第j列位置上的元素.)

涉及兩個基礎公式,合併成第三個公式.:

前i-1行的元素個數:3(i-1)-1 (其中因子3是n對角矩陣n=3時的特例)

a(i,j)是第i行對角線區域的第 (j-i)+2 個元素(2是n對角矩陣n=3下的線性關係的修正因子)*/

intget_tri_diagonal

(intcompressedmatrix* pmat,

int i,

int j,

int* x)

if(j >= i -

1&& j <= i +1)

/*只訪問對角線和他相鄰的兩條平行線上的元素,其餘元素由else統一處理.*/

else

return1;

}/*(22)除錯

根據上述壓縮矩陣定義,完成下面**,執行並除錯程式。

*//*填充二維陣列函式fill_two_dimenssion_array(int (*arr_2)[dim])*/

void

fill_two_dimenssion_array

(int

(*arr_2)

[dim])}

}/*(22)除錯

根據上述壓縮矩陣定義,完成下面**,執行並除錯程式。

*//*填充二維陣列函式fill_two_dimenssion_array(int (*arr_2)[dim])*/

void

fill_two_dimenssion_array

(int

(*arr_2)

[dim])}

}int

main()

,,, }*/

;//初始化而非賦值,如果不直接初始化的話,第乙個乃至每個維數都不可省略;

int m2[dim]

[dim]

/*= ,,,

}*/;int m2_2[dim]

[dim]

/*= ,,,

}*/;int m3[dim]

[dim]

/*= ,,,

}*/;// 定義乙個 壓縮矩陣mat,並用m1初始化mat

intcompressedmatrix mat;

/*壓縮處理後的陣列儲存於此*/

printf

("執行壓縮處理:\n");

/* */

fill_two_dimenssion_array

(m1)

;printf

("壓縮對稱矩陣:\n");

initsmatrix

(&mat, m1)

;/* fill_two_dimenssion_array(m2);

printf("壓縮三角矩陣:\n");

initsmatrix_********_down(&mat, m2);*/

/*fill_two_dimenssion_array(m2_2);

printf("壓縮上三角矩陣:\n");

initsmatrix_********_up(&mat, m2_2);*/

/* fill_two_dimenssion_array(m3);

printf("壓縮對三角矩陣:\n");

initsmatrix_tri_diagonal(&mat, m3);*/

// 列印該mat

printf

("解壓並列印mat矩陣\n");

/*解壓並列印:(全遍例)*/

for(

int i =

1; i <= dim; i++

)printf

("\n");

}}

資料結構 壓縮特殊矩陣

矩陣是一種常用的數學物件,一般情況下,小的矩陣我們可以直接用二維陣列直觀方便地儲存,但是在科學與工程計算問題中常會遇到較高階數的矩陣,並且矩陣中會出現大量零元素,或者矩陣中的元素呈某種規律分布。如果在這種情況下仍然採用二維陣列描述矩陣,看起來儲存密度為1,實際上卻占用了許多單元去儲存零元素或重複的非...

資料結構知識點歸納(特殊矩陣的壓縮儲存)

陣列是由n n 1 個相同型別的資料元素構成的有限序列,每個資料元素稱為乙個陣列元素,每個元素受n個線性關係的約束,每個元素在n個線性關係的序號稱為該元素的下標,並稱該陣列為n維陣列 from 王道 陣列與線性表的關係 from 王道 陣列是線性表的推廣。一維陣列也可以看作乙個線性表 二維陣列也可以...

資料結構 稀疏矩陣的壓縮儲存

目錄 關於矩陣 稀疏矩陣 行優先和列優先 稀疏矩陣的壓縮儲存 在矩陣中,若數值為0的元素數目遠遠多於非0元素的數目,並且非0元素分布沒有規律時,則稱該矩陣為稀疏矩陣 與之相反,若非0元素數目佔大多數時,則稱該矩陣為稠密矩陣。如這個稀疏矩陣,這個矩陣占用了6 7的元素型別大小,但是裡邊有大量的0,即有...