1. 程式人生 > 其它 >基於三元組的矩陣乘積演算法

基於三元組的矩陣乘積演算法

求矩陣乘積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 若標題中有“轉載”字樣,則本文版權歸原作者所有。歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線,否則保留追究法律責任的權利.