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