国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

稀疏矩陣的運(yùn)算-加、減、乘、轉(zhuǎn)置(C-數(shù)據(jù)結(jié)構(gòu))

這篇具有很好參考價(jià)值的文章主要介紹了稀疏矩陣的運(yùn)算-加、減、乘、轉(zhuǎn)置(C-數(shù)據(jù)結(jié)構(gòu))。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

題目

以三元組的形式給出輸入數(shù)據(jù),選擇對應(yīng)的運(yùn)算后給出對應(yīng)輸出結(jié)果(稀疏矩陣的運(yùn)算器)

思路

頁面布局就不說了,這里大概說一下各個(gè)運(yùn)算模塊的實(shí)現(xiàn)
加減法
將三元組中對應(yīng)的元素行列位置進(jìn)行比較,將較為靠前的元素直接放進(jìn)新的三元組存儲(chǔ)結(jié)構(gòu),位置相同的元素通過對應(yīng)符號(hào)判斷是加法還是減法,運(yùn)算后放入新的三元組存儲(chǔ)結(jié)構(gòu),最后輸出即可,具體結(jié)合代碼
乘法
根據(jù)輸入的兩個(gè)矩陣,對結(jié)果矩陣的行數(shù)和列數(shù)進(jìn)行初始化,然后分別求結(jié)果矩陣的每一個(gè)元素,如果為非零元素,將其加入三元組存儲(chǔ)結(jié)構(gòu),具體結(jié)合代碼
轉(zhuǎn)置
使用num1數(shù)組記錄每一列的元素?cái)?shù)量,用pos數(shù)組記錄結(jié)果矩陣中每一行的第一個(gè)非零元素的位置,然后遍歷需要計(jì)算的矩陣的非零元素,放入對應(yīng)位置即可,每次放入后需要將pos數(shù)組中對應(yīng)位置加一,因?yàn)榇颂幰呀?jīng)放元素了,下一次就應(yīng)該放在下一個(gè)位置(所以pos[i]數(shù)組實(shí)際上表示的是原矩陣對應(yīng)列為i的元素應(yīng)該放在結(jié)果矩陣中的位置)。具體結(jié)合代碼。

測試數(shù)據(jù)

加法
輸入

1
3 3
2
1 1 1
1 2 2
2
1 1 2
1 3 3

結(jié)果
稀疏矩陣的運(yùn)算-加、減、乘、轉(zhuǎn)置(C-數(shù)據(jù)結(jié)構(gòu))

乘法
輸入

3
3 5
5 3
4
1 1 4
1 2 -3
2 4 8
3 3 1
5
1 1 3
2 1 4
2 3 -1
3 2 1
4 1 1

結(jié)果
稀疏矩陣的運(yùn)算-加、減、乘、轉(zhuǎn)置(C-數(shù)據(jù)結(jié)構(gòu))
轉(zhuǎn)置
輸入

4
4 4
3
1 1 2
1 2 3
3 2 3

結(jié)果
稀疏矩陣的運(yùn)算-加、減、乘、轉(zhuǎn)置(C-數(shù)據(jù)結(jié)構(gòu))文章來源地址http://www.zghlxwxcb.cn/news/detail-510090.html

代碼

#include<stdio.h>

#define MAXSIZE 10000

typedef struct {
	int row;
	int col;
	double value;
}Triple;
typedef struct {
	Triple data[MAXSIZE+1];
	int rows,cols,nums; //行數(shù),列數(shù),非零元素個(gè)數(shù) 
}TSMatrix;

void init(TSMatrix *p,int m,int n); //初始化 
void input(TSMatrix *p,int num); //輸入 
void compute(TSMatrix *p1,TSMatrix *p2,TSMatrix *p3,char c); //計(jì)算
void mulCompute(TSMatrix *p1,TSMatrix *p2,TSMatrix *p3); //乘法 
double get(TSMatrix *p,int m,int n);//獲取三元組p中存儲(chǔ)中處于m行n列的元素值 
void transpose(TSMatrix *p,TSMatrix *p3); //稀疏矩陣的轉(zhuǎn)置 

int main()
{
	TSMatrix x1,x2,x3;
	while(1){
		printf("1--加\n2--減\n3-乘\n4--轉(zhuǎn)置\n5--退出\n請輸入計(jì)算方式:");
		int choice;
		scanf("%d",&choice);
		switch(choice){
			case 1:
				compute(&x1,&x2,&x3,'+');
				break;
			case 2:
				compute(&x1,&x2,&x3,'-');
				break;
			case 3:
				mulCompute(&x1,&x2,&x3); 
				break;
			case 4:
				transpose(&x1,&x3);
		}
		if(choice==5){
			break;
		}
		printf("結(jié)果為(三元組形式---行 列 值):\n");
		for(int i=1;i<=x3.nums;i++){
			printf("%4d %4d %4.0lf\n",x3.data[i].row,x3.data[i].col,x3.data[i].value);
		}
		printf("矩陣形式為:\n");
		int cnt1=1;
		for(int i=1;i<=x3.rows;i++){
			for(int j=1;j<=x3.cols;j++){
				printf("%4.0lf",cnt1<=x3.nums&&i==x3.data[cnt1].row&&j==x3.data[cnt1].col?x3.data[cnt1++].value:0);
			}
			printf("\n");
		}
		
	}
 } 
 //初始化 
void init(TSMatrix *p,int m,int n)
{
	p->rows=m;
	p->cols=n;
	p->nums=0;
}
//輸入 
void input(TSMatrix *p,int num)
{
	int cnt=1;
	for(int i=1;i<=num;i++){
		scanf("%d %d %lf",&p->data[cnt].row,&p->data[cnt].col,&p->data[cnt].value);
		p->nums++;
		cnt++;
	} 
} 
//計(jì)算
void compute(TSMatrix *p1,TSMatrix *p2,TSMatrix *p3,char c)
{
	int m,n,num; 
	printf("請輸入要進(jìn)行計(jì)算的稀疏矩陣的行數(shù)和列數(shù) m n:");
	scanf("%d %d",&m,&n); 
	init(p1,m,n);
	init(p2,m,n);
	init(p3,m,n);	
	printf("請輸入第一個(gè)矩陣的非零元素個(gè)數(shù):\n"); 
	scanf("%d",&num);
	printf("請輸入第一個(gè)矩陣的非零元素三元組:\n"); 
	input(p1,num);
	printf("請輸入第二個(gè)矩陣的非零元素個(gè)數(shù):\n"); 
	scanf("%d",&num);
	printf("請輸入第二個(gè)矩陣的非零元素三元組:\n"); 
	input(p2,num);
	int cnt=1;
	int i=1,j=1;
	while(i<=p1->nums&&j<=p2->nums){
		if(p1->data[i].row<p2->data[j].row){
			p3->data[cnt]=p1->data[i];
			p3->nums++;
			cnt++;
			i++;	
		}else if(p1->data[i].row>p2->data[j].row){
			p3->data[cnt]=p2->data[j];
			p3->nums++;
			cnt++;
			j++;
		}else{
			if(p1->data[i].col<p2->data[j].col){
				p3->data[cnt]=p1->data[i];
				p3->nums++;
				cnt++;
				i++;
			}else if(p1->data[i].col<p2->data[j].col){
				p3->data[cnt]=p2->data[j];
				p3->nums++;
				cnt++;
				j++;
			}else{
				p3->data[cnt]=p1->data[i];
				p3->data[cnt].value= c=='+'?p1->data[i].value+p2->data[j].value:p1->data[i].value-p2->data[j].value;
				p3->nums++;
				cnt++;
				i++;
				j++;
			}
		}
	}
	while(i<=p1->nums) {
		p3->data[cnt]=p1->data[i];
		p3->nums++;
		cnt++;
		i++;
	}
	while(j<=p2->nums){
		p3->data[cnt]=p2->data[j];
		p3->nums++;
		cnt++;
		j++;
	}
}
//乘法 
void mulCompute(TSMatrix *p1,TSMatrix *p2,TSMatrix *p3)
{
	int m,n,num,cnt=1;
	printf("請輸入第一個(gè)稀疏矩陣的行數(shù)和列數(shù) m n:");
	scanf("%d %d",&m,&n);
	init(p1,m,n);
	printf("請輸入第二個(gè)稀疏矩陣的行數(shù)和列數(shù) m n:");
	scanf("%d %d",&m,&n);
	init(p2,m,n);
	if(p1->cols!=p2->rows){
		printf("無法進(jìn)行乘法運(yùn)算");
		return; 
	}
	init(p3,p1->rows,p2->cols);
	printf("請輸入第一個(gè)矩陣的非零元素個(gè)數(shù):\n"); 
	scanf("%d",&num);
	printf("請輸入第一個(gè)矩陣的非零元素三元組:\n"); 
	input(p1,num);
	printf("請輸入第二個(gè)矩陣的非零元素個(gè)數(shù):\n"); 
	scanf("%d",&num);
	printf("請輸入第二個(gè)矩陣的非零元素三元組:\n"); 
	input(p2,num);
	for(int i=1;i<=p1->rows;i++){
		for(int j=1;j<=p2->cols;j++){
			double sum=0;
			//sum表示p1中第i行元素與p2中第j列元素對應(yīng)相乘之和 
			for(int k=1;k<=p1->cols;k++){
				sum+=get(p1,i,k)*get(p2,k,j); 
			}
			if(sum){
				p3->data[cnt].row=i;
				p3->data[cnt].col=j;
				p3->data[cnt].value=sum;
				cnt++;
				p3->nums++;
			}
		}
	} 
}
//獲取三元組p中存儲(chǔ)中處于m行n列的元素值
double get(TSMatrix *p,int m,int n)
{
	for(int i=0;i<=p->nums;i++){
		if(p->data[i].row==m&&p->data[i].col==n){
			return p->data[i].value;
		}
	}
	return 0;
}
//稀疏矩陣的轉(zhuǎn)置 
void transpose(TSMatrix *p,TSMatrix *p3)
{
	int m,n,num;
	printf("請輸入要進(jìn)行轉(zhuǎn)置的稀疏矩陣的行數(shù)和列數(shù) m n:");
	scanf("%d %d",&m,&n);
	init(p,m,n); 
	printf("請輸入該矩陣的非零元素個(gè)數(shù):\n"); 
	scanf("%d",&num);
	printf("請輸入該矩陣的非零元素三元組:\n"); 
	input(p,num);
	p3->cols=p->rows;
	p3->rows=p->cols;
	p3->nums=p->nums;
	int num1[(p->nums)+1]={0};
	int pos[(p->nums)+1]={0};
	if(p->nums){
		for(int i=1;i<=p->nums;i++){
			num1[p->data[i].col]++;
		}
		pos[1]=1;
		for(int i=2;i<=p->nums;i++){
			pos[i]=pos[i-1]+num1[i-1];
		}
		for(int i=1;i<=p->nums;i++){
			p3->data[pos[p->data[i].col]].col=p->data[i].row;
			p3->data[pos[p->data[i].col]].row=p->data[i].col;
			p3->data[pos[p->data[i].col]].value=p->data[i].value;
			pos[p->data[i].col]++;
		}
	}
}

到了這里,關(guān)于稀疏矩陣的運(yùn)算-加、減、乘、轉(zhuǎn)置(C-數(shù)據(jù)結(jié)構(gòu))的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包