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.輸...