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
如果中间存在空行,则这一行怎么认为?