稀疏矩阵相乘

1 例子

 

 2算法思想

 3代码

 

4 代码注释

//教训,书写代码for循环中,要对齐 
Status MultSMatrix(RLSMatrix M,RLSMatrix N,RLSMatrix &Q){
 //求矩阵乘积Q=M*N,采用行逻辑链接存储表示
    if(M.nu!=N.mu) 
        return error;//矩阵要进行相乘,第一个矩阵的列向量等于第二个矩阵的行向量 
    Q.mu=M.mu;
    Q.nu=N.nu;
    Q.tu=0;//Q初始化, Q的非零元个数为0 
    if(M.tu*N.tu!=0){//Q为非零矩阵,再进行下面 
        //下面所述均以矩阵M的第一行进行 
        for(arow=1;arow<=M.mu;++arow){//处理M的每一行 //改过 
            ctemp[]=0;//当前行各元素累加器清0,至于矩阵中不填长度,使其对不同
            //第二个矩阵相乘都适应,使矩阵相乘具有普遍性 
            Q.rpos[arow]=Q.tu+1;//rpos[]为矩阵某一行第一个元素所对应的三元数组的位置 
            if(arow<M.mu) //在第一行时,arow<3,执行下面,tp=m的第二行的第一个元素
            //所对应的位置,这些都说的是三元数组,这个tp是为了下面的循环,如果arow为3,
            //执行else,tp=所有非零数加1,这里有*漏洞*,如果某一行都是0呢,不是漏洞,
            //矩阵相乘,如果一个矩阵有一行为0,则这个矩阵不为0,则下一行没有非零元(在题目中
            //N的第四行出现) tp是提供下面for循环的边界 
                tp=M.rpos[arow+1];
            else    
                tp=M.tu+1;
            for(p=M.rpos[arow];p<tp;++p){//对当前行中的每一个非零元,以(1,1,2)为例 
                brow=M.data[p].j;         //找到对应元在N中的行号 
                if(brow<N.mu) //brow为1,t也是为了求下面for循环的边界 
                    t=N.rpos[brow+1];//和上面边界求法相同,如果<mu,则if后面,>mu,则
                    //总的非零元加1 ,难道这个走不下去,会直接中断? 
                else t=N.tu+1;
                for(q=N.rpos[brow];q<t;++q){//q为M中一点的列坐标对应的对应在N中行坐标的第一个非零元在三元数组的位置 
                //在p=2的时候,M(1,4,5 )N当中没有for中ccol的值,有问题,循环不下去 
                    ccol=N.data[q].j;//乘积元素在Q中列号 
                    ctemp[ccol]+=M.data[p].e*N.data[q].e;
                }// for q
            }//求得Q中第crow(=arow)行的非零元 
            for(ccol=1;ccol<=Q.nu;++ccol)//压缩存储该行非零元 开始存储第一行 
                if(ctemp[ccol]){//如果累加器不为0,往下,Q在第一行Q(1,1)就不需要往下 Q(1,2)就可以继续 
                    if(++Q.tu>MAXSIZE) //存储空间大的话,就直接输出error ,先加后进行比较Q.tu就在第一次M的第一行变为1 
                    return ERROR;
                    Q.data[Q.tu]=(arow,ccol,ctemp[ccol]);
                }//if
        }// for arow
    }// if
    return OK;
}//MultSMatrix
//疑问:在问if语句的时候,下一行若全部为0,就没有非零元,那rpos[arow+1]怎么运行?
//这里应该是与rpos定义相关
rpos为每一行中第一个非零元在三元表中的位置 

5思考

第四行没有数据,N的rpos认定为5

如果中间存在空行,则这一行怎么认为? 

 

 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值