基于三元组的矩阵乘积算法
2022/2/4 20:13:00
本文主要是介绍基于三元组的矩阵乘积算法,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
求矩阵乘积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];
这篇关于基于三元组的矩阵乘积算法的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-15鸿蒙生态设备数量超8亿台
- 2024-05-13TiDB + ES:转转业财系统亿级数据存储优化实践
- 2024-05-09“2024鸿蒙零基础快速实战-仿抖音App开发(ArkTS版)”实战课程已上线
- 2024-05-09聊聊如何通过arthas-tunnel-server来远程管理所有需要arthas监控的应用
- 2024-05-09log4j2这么配就对了
- 2024-05-09nginx修改Content-Type
- 2024-05-09Redis多数据源,看这篇就够了
- 2024-05-09Google Chrome驱动程序 124.0.6367.62(正式版本)去哪下载?
- 2024-05-09有没有大佬知道这种数据应该怎么抓取呀?
- 2024-05-09这种运行结果里的10.100000001,怎么能最快改成10.1?