⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rlsmatrix_op.h

📁 利用三元组顺序表表示稀疏矩阵
💻 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 + -