基於三元組的矩陣乘積演算法
阿新 • • 發佈:2022-02-04
求矩陣乘積Q=MxN,採用行邏輯連結儲存表示。
例:M=,N=。Q=MxN,Q=。
三元組
M.data | N.data | Q.data | ||||||
i | j | e | i | j | e | i | j | e |
1 | 1 | 3 | 1 | 2 | 2 | 1 | 2 | 6 |
1 | 4 | 5 | 2 | 1 | 1 | 2 | 1 | -1 |
2 | 2 | -1 | 3 | 1 | -2 | 2 | 1 | -1 |
3 | 1 | 2 | 3 | 2 | 4 | 3 | 2 | 4 |
rpos[row]指示矩陣的第row行中第一個非零元在對應的三元組表中的序號,那麼rpos[row+1]-1表示row行最後一個非零元在對應三元組表中的序號,而最後一行最後一個非零元在對應的三元組中位置為tu。
M.對應的rpos | N.對應的rpos | Q.對應的rpos | ||||||||
row | 1 | 2 | 3 | 1 | 2 | 3 | 4 | 1 | 2 | 3 |
rpos[row] | 1 | 3 | 4 | 1 | 2 | 3 | 5 | 1 | 2 | 3 |
Status MulSMatrix(RLSMatrix M, RLSMatrix N, RLSMatrix Q){ if(M.nu != Nmu) return ERROR; Q.mu = M.mu; Q.nu = N.nu; Q.tu = 0; int ccol; if(M.tu * M.tu != 0){ for(int arrow=1; arrow<=M.mu; ++arow){ int ctemp[M.nu] = 0; //臨時儲存數乘組的陣列 Q.rpos[arow] = Q.tu+1; //第一行第一個非零元必定為1 int tp; if(arow<M.tu) tp = M.rpos[arow+1]; //下一行第一個非零元位置 else tp = M.tu+1; //最後一行,直接最後一個元素+1 for(int p=M.rpos[arrow]; p<tp; ++p){ //遍歷當前行所有非零元 int brow = M.data[p].j; //乘積元素在M中的列號,便於找與N中對應的做乘積的非零元 int t; if(brow<N.mu) t = N.rpos[brow+1]; //找N中做乘法的行,所有非零元 else t = N.tu+1; for{int q=N.rpos[brow]; q<t; ++q){ //遍歷找到對應的非零元,做運算 ccol = N.data[q].j; //乘積元素中的列號,方便儲存 ctemp[ccol] += M.data[p].e * N.data[q].e; //ccol表示列 } } for(ccol=1; ccol<=Q.nu; ++ccol){ //Q.nu表示列序 if(ctemp[ccol]){ //由於結果可能為0,因此判斷一下 if(++Q.tu>MAXSIZE) return ERROR; //不能超出範圍 Q.data[Q.tu] = (arow, ccol, ctemp[ccol]); ++Q.tu; } } } } }
//其中程式碼
Q.data[Q.tu] = (arow, ccol, ctemp[ccol]);
//可理解為
Q.data[Q.tu].i = arow;
Q.data[Q.tu].j = ccol;
Q.data[Q.tu].e = ctemp[ccol];
作者:不像話
出處:https://www.cnblogs.com/jake-jin/
github地址:https://github.com/buxianghua
若標題中有“轉載”字樣,則本文版權歸原作者所有。歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線,否則保留追究法律責任的權利.