基于三元组的矩阵乘积算法

求矩阵乘积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];

 

上一篇:python之xlrd和xlwt小技巧


下一篇:详细解读C语言实现三子棋