📄 rlsmatrix_op.h
字号:
Status AddSMatrix(RLSMatrix M,RLSMatrix N,RLSMatrix &Q)
//矩阵加法,通过行列循环来遍历所有元素,通过rpos来指示当前非零元
{
int i,j,pos;
float sum;
if(M.mu!=N.mu||M.nu!=N.nu) {printf("Matrix don't match!\n");return ERROR;} //矩阵相加判别
Q.mu=M.mu;Q.nu=M.nu;Q.tu=0;
pos=Q.rpos[1]=1;
for(i=1;i<=M.mu;i++)
{
Q.rpos[i]=pos;
for(j=1;j<=M.nu;j++)
{
if(i==M.data[M.rpos[i]].i&&j==M.data[M.rpos[i]].j) //当前位置与矩阵M非零元行号与列号符合
{
if(i==N.data[N.rpos[i]].i&&j==N.data[N.rpos[i]].j) //继续判断是否与矩阵N中非零元位置符合
{
sum=M.data[M.rpos[i]].e+N.data[N.rpos[i]].e; //相符,执行加法
if(sum!=0.0) { //判断是否是非零元
Q.data[pos].i=i;
Q.data[pos].j=j;
Q.data[pos].e=sum;
++pos;
++Q.tu;
}
N.rpos[i]++; //M和N当前位置后移,指向下一个非零元
M.rpos[i]++;
}
else
{
Q.data[pos].e=M.data[M.rpos[i]].e;
Q.data[pos].i=i;
Q.data[pos].j=j;
++pos;
++Q.tu;
++M.rpos[i];
}
}
else if(i==N.data[N.rpos[i]].i&&j==N.data[N.rpos[i]].j) //在M中不匹配但在N中匹配
{
Q.data[pos].e=N.data[N.rpos[i]].e;
Q.data[pos].i=i;
Q.data[pos].j=j;
++Q.tu;
++pos;
++N.rpos[i];
}
}//for j
}//for i
return OK;
}
Status SubSMatrix(RLSMatrix M,RLSMatrix N,RLSMatrix &Q)
{
int i,j,pos;
float sum;
if(M.mu!=N.mu||M.nu!=N.nu) {printf("Matrix don't match!\n");return ERROR;}
Q.mu=M.mu;Q.nu=M.nu;Q.tu=0;
pos=Q.rpos[1]=1;
for(i=1;i<=M.mu;i++)
{
Q.rpos[i]=pos;
for(j=1;j<=M.nu;j++)
{
if(i==M.data[M.rpos[i]].i&&j==M.data[M.rpos[i]].j)
{
if(i==N.data[N.rpos[i]].i&&j==N.data[N.rpos[i]].j)
{
sum=M.data[M.rpos[i]].e-N.data[N.rpos[i]].e;
if(sum!=0.0) {
Q.data[pos].i=i;
Q.data[pos].j=j;
Q.data[pos].e=sum;
++pos;
++Q.tu;
}
N.rpos[i]++;
M.rpos[i]++;
}
else
{
Q.data[pos].e=M.data[M.rpos[i]].e;
Q.data[pos].i=i;
Q.data[pos].j=j;
++pos;
++Q.tu;
++M.rpos[i];
}
}
else if(i==N.data[N.rpos[i]].i&&j==N.data[N.rpos[i]].j)
{
Q.data[pos].e=-N.data[N.rpos[i]].e;
Q.data[pos].i=i;
Q.data[pos].j=j;
++Q.tu;
++pos;
++N.rpos[i];
}
}//for j
}//for i
return OK;
}
Status MultSMatrix(RLSMatrix M,RLSMatrix N,RLSMatrix &Q)
//矩阵乘法,采用行逻辑链接存储表示
{
float ctemp[MAXRC+1]={0.0};
int arow,brow,ccol,p,q,tp,t,i;
if(M.nu!=N.mu) {printf("Matrix don't match!\n");return ERROR;} //相乘判别
Q.mu=M.mu;Q.nu=N.nu; //Q初始化
Q.tu=0;
if(M.tu*N.tu!=0){ //Q是非0矩阵
for(arow=1;arow<=M.mu;++arow)
{
for(i=0;i<MAXRC+1;i++) ctemp[i]=0; //累加器清零
Q.rpos[arow]=Q.tu+1;
if(arow<M.mu) tp=M.rpos[arow+1];
else tp=M.tu+1;
for(p=M.rpos[arow];p<tp;++p) //对当前行的每一个非零元找到对应元在N中的行号
{
brow=M.data[p].j;
if(brow<N.mu) t=N.rpos[brow+1];
else t=N.tu+1;
for(q=N.rpos[brow];q<t;++q)
{
ccol=N.data[q].j; //乘积元素在Q中的列号
ctemp[ccol]+=M.data[p].e*N.data[q].e;
}//for q
}//求Q中第crow行的非零元
for(ccol=1;ccol<=Q.nu;++ccol) //压缩存储该行非零元
if(ctemp[ccol]!=0.0)
{
if(++Q.tu>MAXSIZE) return ERROR;
Q.data[Q.tu].i=arow;
Q.data[Q.tu].j=ccol;
Q.data[Q.tu].e=ctemp[ccol];
}//if
}//for arow
}//if
return OK;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -