基于三元组的矩阵乘积算法
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-12-27OpenFeign服务间调用学习入门
- 2024-12-27OpenFeign服务间调用学习入门
- 2024-12-27OpenFeign学习入门:轻松掌握微服务通信
- 2024-12-27OpenFeign学习入门:轻松掌握微服务间的HTTP请求
- 2024-12-27JDK17新特性学习入门:简洁教程带你轻松上手
- 2024-12-27JMeter传递token学习入门教程
- 2024-12-27JMeter压测学习入门指南
- 2024-12-27JWT单点登录学习入门指南
- 2024-12-27JWT单点登录原理学习入门
- 2024-12-27JWT单点登录原理学习入门