基于三元组的矩阵乘积算法
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-06-05做软件测试需要懂代码吗?
- 2024-06-0514-ShardingSphere的分布式主键实现
- 2024-06-03为什么以及如何要进行架构设计权衡?
- 2024-05-31全网首发第二弹!软考2024年5月《软件设计师》真题+解析+答案!(11-20题)
- 2024-05-31全网首发!软考2024年5月《软件设计师》真题+解析+答案!(21-30题)
- 2024-05-30【Java】百万数据excel导出功能如何实现
- 2024-05-30我们小公司,哪像华为一样,用得上IPD(集成产品开发)?
- 2024-05-30java excel上传--poi
- 2024-05-30安装笔记本应用商店的pycharm,再安排pandas等模块,说是没有打包工具?
- 2024-05-29java11新特性