基于三元组的矩阵乘积算法
求矩阵乘积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(arowMAXSIZE) 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];