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

📄 smatrix.c

📁 稀疏矩阵运算器 稀疏矩阵运算器
💻 C
字号:
#include "smatrix.h"
#include <stdio.h>
#include <stdlib.h>
Status CreateRLSMatrix(RLSMatrix * sm)
{
	int m=1,n=1,num=1;
	sm->tu=0;
	fflush(stdin);
	printf("请输入矩阵的行数和列数:");
	scanf("%d%d",&sm->mu,&sm->nu);
	printf("请以按行优先的顺序输入矩阵的非零元i j e:\n");
		scanf("%d %d %d",&sm->data[m].i,&sm->data[m].j,&sm->data[m].e);
	while(sm->data[m].e){
		if(m==1){ 
			sm->rpos[n]=1;
			n++;
		}
		else if(sm->data[m].i==sm->data[m-1].i) num++;
			 else {
						sm->rpos[sm->data[m].i]=sm->rpos[n-1]+num;
						for(;n<=sm->data[m].i;n++){
							sm->rpos[n]=sm->rpos[sm->data[m].i];
							num=1;
						}
					}
		m++;
		sm->tu++;
        scanf("%d %d %d",&sm->data[m].i,&sm->data[m].j,&sm->data[m].e);
	}
	for(;n<=sm->mu;n++) sm->rpos[n]=sm->tu;
	return OK;
}




Status AddRLSMatrix(RLSMatrix * sm_a,RLSMatrix * sm_b)
{
	int n,a=1,b=1;
	while(a<=sm_a->tu && b<=sm_b->tu){
		if(sm_a->data[a].i<sm_b->data[b].i || (sm_a->data[a].i==sm_b->data[b].i && sm_a->data[a].j<sm_b->data[b].j)){
				a++;
				continue;
		}
		if(sm_a->data[a].i==sm_b->data[b].i && sm_a->data[a].j==sm_b->data[b].j){
			sm_a->data[a].e+=sm_b->data[b].e;
			b++;
			if(sm_a->data[a].e==0){
					for(n=a;n<sm_a->tu;n++)
						sm_a->data[n]=sm_a->data[n+1];
					sm_a->tu--;	
			}
			else a++;
	}
	if(sm_a->data[a].i>sm_b->data[b].i || (sm_a->data[a].i==sm_b->data[b].i && sm_a->data[a].j>sm_b->data[b].j)){
		for(n=sm_a->tu;n>=a;n--)
			sm_a->data[n+1]=sm_a->data[n];
		sm_a->data[a]=sm_b->data[b];
		a++;
		b++;
		sm_a->tu++;
	}
	}
	while(b<=sm_b->tu) 
	{
		sm_a->data[a++]=sm_b->data[b++];
		sm_a->tu++;
	}
	return OK;
}





Status SubRLSMatrix(RLSMatrix * sm_a,RLSMatrix * sm_b)
{
	int n,a=1,b=1;
	while(a<=sm_a->tu && b<=sm_b->tu){
		if(sm_a->data[a].i<sm_b->data[b].i || (sm_a->data[a].i==sm_b->data[b].i && sm_a->data[a].j<sm_b->data[b].j)){
				a++;
				continue;
		}
		if(sm_a->data[a].i==sm_b->data[b].i && sm_a->data[a].j==sm_b->data[b].j){
			sm_a->data[a].e-=sm_b->data[b].e;
			b++;
			if(!sm_a->data[a].e){
					for(n=a;n<sm_a->tu;n++){
						sm_a->data[n]=sm_a->data[n+1];
						sm_a->tu--;
					}
			}
			else a++;
		}
		if(sm_a->data[a].i>sm_b->data[b].i || (sm_a->data[a].i==sm_b->data[b].i && sm_a->data[a].j>sm_b->data[b].j)){
			for(n=sm_a->tu;n>=a;n--)
				sm_a->data[n+1]=sm_a->data[n];
			sm_a->data[a]=sm_b->data[b];
	
			a++;
			b++;
			sm_a->tu++;
		}
 	}
	while(b<=sm_b->tu){
		sm_a->data[a]=sm_b->data[b];
		sm_a->data[a].e=-sm_a->data[a].e;
		a++;
		b++;
		sm_a->tu++;
	}
	return OK;
}

		
			
Status PrintRLSMatrix(RLSMatrix * sm)
{
	int m,n,t=1;
	for(m=1;m<=sm->mu;m++){
		for(n=1;n<=sm->nu;n++){
			if(m==sm->data[t].i && n==sm->data[t].j){
				printf("%2d  ",sm->data[t].e);
				t++;
			}
			else printf(" 0  ");
		}
		printf("\n");
	}
	return OK;
}


Status MultRLSMatrix(RLSMatrix * sm_a,RLSMatrix * sm_b)
{
	int i,j,a,b,sum,t;
	int result[20][20]={0};
	for(i=1;i<=sm_a->mu;i++){
		for(j=1;j<=sm_b->nu;j++){
				sum=0;
				if(i<sm_a->mu) t=sm_a->rpos[i+1];
				else t=sm_a->tu+1;
				for(a=sm_a->rpos[i];a<=sm_a->tu && a<t;a++)
					for(b=1;b<=sm_b->tu;b++)
						if(sm_b->data[b].j==j && sm_a->data[a].j==sm_b->data[b].i)
							sum+=sm_a->data[a].e*sm_b->data[b].e;
				result[i][j]=sum;
		}
		if(a>sm_a->tu && j>sm_b->nu) break;
	}
	for(i=1;i<=sm_a->mu;i++){
		for(j=1;j<=sm_b->nu;j++)
			printf("%3d",result[i][j]);
		printf("\n");
	}
	return OK;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -