稀疏矩陣演算法

2021-09-08 07:53:03 字數 3877 閱讀 5614

1、稀疏矩陣的壓縮儲存

為了節省儲存單元,可只儲存非零元素。由於非零元素的分布一般是沒有規律的,因此在儲存非零元素的同時,還必須儲存非零元素所在的行號、列號,才能迅速確定乙個非零元素是矩陣中的哪乙個元素。稀疏矩陣的壓縮儲存會失去隨機訪問功能。

其中每乙個非零元素所在的行號、列號和值組成乙個三元組(i,j,aij),並由此三元組惟一確定。

稀疏矩陣進行壓縮儲存通常有兩類方法:順序儲存和鏈式儲存。鏈式儲存方法。

2、三元組表

將表示稀疏矩陣的非零元素的三元組按行優先(或列優先)的順序排列(跳過零元素),並依次存放在向量中,這種稀疏矩陣的順序儲存結構稱為三元組表。

注意:以下的討論中,均假定三元組是按行優先順序排列的。

(1)三元組表的型別說明

為了運算方便,將矩陣的總行數、總列數及非零元素的總數均作為三元組表的屬性進行描述。其型別描述為:

#define maxsize 10000 //由使用者定義

typedef int datatype; //由使用者定義

typedef struct trituplenode;

typedef structtritupletable; 

(2) 壓縮儲存結構上矩陣的轉置運算

乙個m×n的矩陣a,它的轉置矩陣b是乙個n×m的矩陣,且:

a[i][j]=b[j][i],0≤idata置換為b的三元組表b->data。

②三元組表的轉置

方法一:簡單地交換a->data中i和j中的內容,得到按列優先順序儲存倒b->data;再將b->data重排成按行優先順序的三元組表。

方法二:由於a的列是b的行,因此,按a->data的列序轉置,所得到的轉置矩陣b的三元組表b->data必定是按行優先存放的。

按這種方法設計的演算法,其基本思想是:對a中的每一列col(0≤col≤a->n-1),通過從頭至尾掃瞄三元組表a->data,找出所有列號等於col的那些三元組,將它們的行號和列號互換後依次放人b->data中,即可得到b的按行優先的壓縮存貯表示。

下面是完整的稀疏矩陣演算法,包括加法,轉置,乘法等

#include

#include

#define a 6

#define b 7

#define a1 3

#define b1 4

#define a2 4

#define b2 2

#define ok 1

#define error -1;

#define maxsize 1000

typedef int status;

typedef int elemtype;

typedef struct triple;       

typedef struct tsmatrix;       

void creattripletable (int array_a[a][b],tsmatrix *a)

/*array_aêçò»¸öï¡êè¾øõó,aêç²úéúµäïà¶ôó¦µäèýôª×é´æ´¢*/

a->mu=a;

a->nu=b;

// data[0][1]=n;

a->tu=k-1;/*´æèë·ç0ôªëø¸öêý*/

}/*creattripletable*/

void creattripletable1 (int array_a[a1][b1],tsmatrix *a)

/*array_aêçò»¸öï¡êè¾øõó,aêç²úéúµäïà¶ôó¦µäèýôª×é´æ´¢*/

a->mu=a1;

a->nu=b1;

a->tu=k-1;/*´æèë·ç0ôªëø¸öêý*/

}void creattripletable2 (int array_a[a2][b2],tsmatrix *a)

/*array_aêçò»¸öï¡êè¾øõó,aêç²úéúµäïà¶ôó¦µäèýôª×é´æ´¢*/

a->mu=a2;

a->nu=b2;

a->tu=k-1;/*´æèë·ç0ôªëø¸öêý*/

}status transposesmatrix(tsmatrix *m,tsmatrix *t)

}         

return ok;

} status fasttransposesmatrix(tsmatrix *m,tsmatrix *t)

}               

return ok;

}  

status tsmatrix_add(tsmatrix m,tsmatrix n,tsmatrix *c)//èýôª×é±íê¾µäï¡êè¾øõó¼ó·¨

}//if

else if(m.data[pa].j>n.data[pb].j)

else

}//while

while(m.data[pa].i==x) //²åèëaöðê£óàµäôªëø(µúxðð)

while(n.data[pb].i==x) //²åèëböðê£óàµäôªëø(µúxðð)

}//for

c->tu=pc;

return ok;

}//tsmatrix_add  

void printsmatrix(tsmatrix m)

status multsmatrix(tsmatrix m,tsmatrix n,tsmatrix *q)   

}      

}  

}      

void destroysmatrix(tsmatrix m)

int main(int argc, char *ar**)

,,,,,};

int array1[a][b]=,,,,,};

int array2[a1][b1]=,,};

int array3[a2][b2]=,,,};

//a=(tsmatrix *)malloc(sizeof(tsmatrix)); 

creattripletable(array,&a);

printsmatrix(a);

printf("transpose\n");

transposesmatrix(&a,&c);

printsmatrix(c);

printf("fast transpose\n");

fasttransposesmatrix(&a,&d);

printsmatrix(d);   

printf("add transpose\n");

creattripletable(array1,&b); 

tsmatrix_add(a,b,&e);

printsmatrix(e);

creattripletable1(array2,&aa);

printsmatrix(aa);

creattripletable2(array3,&bb);

printsmatrix(bb);

getrpos(&aa);

getrpos(&bb);

multsmatrix(aa,bb,&cc);

printsmatrix(cc);

destroysmatrix(a);

destroysmatrix(b);               

destroysmatrix(c);

destroysmatrix(aa);

destroysmatrix(bb);               

destroysmatrix(cc);

system("pause"); 

return 0;

}

em演算法 稀疏矩陣 稀疏矩陣的快速轉置原理及其演算法

關於稀疏矩陣的快速轉置法,首先得明白其是通過對三元表進行轉置。如果誤以為是對矩陣進行轉置,毫無疑問就算你想破腦袋也想不出個所以然,別陷入死胡同了!對於乙個三元表,行為i,列為j,值為v。需將其i與j的值對調才能得到新的三元表,但是如果直接進行轉換,得到的新的三元表的順序是混亂的,不符合三元表的規則。...

特殊矩陣 稀疏矩陣

對於乙個m n的矩陣,設s為矩陣的元素總個數s m n,設t為矩陣中非零元素的個數,滿足t 稀疏矩陣的零元素非常多,且分布無規律,所以稀疏矩陣的壓縮儲存方法為 只儲存矩陣中的非零元素,按照三元組的形式儲存。三元組由非零元素,該元素行下標和該元素列下標三個資料構成,放在乙個列數為3的陣列中。儲存結構又...

C語言演算法實驗 稀疏矩陣

實驗內容與要求 內容 問題描述 從鍵盤輸入乙個稀疏矩陣a,稀疏矩陣的輸入形式採用三元組表示,然後進行快速轉置成b,輸出矩陣b。要求 n設計要求 首先設計乙個含有多個選單項的主控選單程式,然後再為這些選單項配上相應的功能。1 三元組形式輸入稀疏矩陣a 2 輸出矩陣a 三元組形式 3 a轉置為b 4.輸...