ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

基于三元组的矩阵乘积算法

2022-02-04 19:02:16  阅读:164  来源: 互联网

标签:rpos 乘积 tu 矩阵 三元组 ccol data row


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

 

标签:rpos,乘积,tu,矩阵,三元组,ccol,data,row
来源: https://www.cnblogs.com/jake-jin/p/15863277.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有