矩陣相加的演算法(儲存結構為三元組表)
阿新 • • 發佈:2018-12-30
假設稀疏矩陣A和B均以三元組表作為儲存結構。試寫出矩陣相加的演算法,另設三元組表C存放結果矩陣。
稀疏矩陣的三元組順序表型別TSMatrix的定義:
#define MAXSIZE 20 // 非零元個數的最大值
typedef struct {
int i,j; // 行下標,列下標
ElemType e; // 非零元素值
}Triple;
typedef struct {
Triple data[MAXSIZE+1]; // 非零元三元組表,data[0]未用
int mu,nu,tu; // 矩陣的行數、列數和非零元個數
}TSMatrix;
實現函式如下:
Status AddTSM(TSMatrix A,TSMatrix B,TSMatrix &C) /* 三元組表示的稀疏矩陣加法: C=A+B */ { int ai,bi,ci,aj,bj,cj,ap,bp,cp; ap = bp = cp = 1; if(A.mu != B.mu || A.nu != B.nu){ return ERROR; } C.mu = A.mu; C.nu = A.nu; while(ap <= A.tu && bp <= B.tu){ ai = A.data[ap].i; bi = B.data[bp].i; if(ai > bi){ ci = bi; while(ci == B.data[bp].i){ C.data[cp].i = ci; C.data[cp].j = B.data[bp].j; C.data[cp].e = B.data[bp].e; ++bp; ++cp; } }else if(ai < bi){ ci = ai; while(ci == A.data[ap].i){ C.data[cp].i = ci; C.data[cp].j = A.data[ap].j; C.data[cp].e = A.data[ap].e; ++ap; ++cp; } }else if(ai == bi){ ci = ai; aj = A.data[ap].j; bj = B.data[bp].j; if(aj > bj){ C.data[cp].i = ci; C.data[cp].j = bj; C.data[cp].e = B.data[bp].e; ++cp; ++bp; }else if(aj < bj){ C.data[cp].i = ci; C.data[cp].j = aj; C.data[cp].e = A.data[ap].e; ++cp; ++ap; }else if(aj == bj){ if(A.data[ap].e + B.data[bp].e != 0){ C.data[cp].i = ci; C.data[cp].j = aj; C.data[cp].e = A.data[ap].e + B.data[bp].e; ++cp; } ++ap; ++bp; } } } //以上為稀疏矩陣A或B中的元素完全加完的情況 //以下為稀疏矩陣A或B中的元素部分剩餘的情況 while(ap <= A.tu){ C.data[cp].i = A.data[ap].i; C.data[cp].j = A.data[ap].j; C.data[cp].e = A.data[ap].e; ++cp; ++ap; } while(bp <= B.tu){ C.data[cp].i = B.data[bp].i; C.data[cp].j = B.data[bp].j; C.data[cp].e = B.data[bp].e; ++cp; ++bp; } C.tu = --cp; return OK; }