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

C++數(shù)據(jù)結(jié)構(gòu)稀疏矩陣運(yùn)算(含加減乘及快速轉(zhuǎn)置)

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

題目:

內(nèi)容:稀疏矩陣運(yùn)算器

要求:使用三元組順序表存儲(chǔ)矩陣;實(shí)現(xiàn)矩陣的逆置、加、減、乘運(yùn)算;具有相應(yīng)的報(bào)錯(cuò)處理。

本人采用C++來書寫該數(shù)據(jù)結(jié)構(gòu)的題目,有興趣的同學(xué)可以了解一下需要掌握一定的封裝的能力。

類的結(jié)果存儲(chǔ)如下所示:

class ju{
	struct shu{
		int i,j;
		int x;
	};
	int m,n;
	int len;
	shu a[25];
	public:
		int juzhen[10][10];    //矩陣內(nèi)容的存儲(chǔ)
		ju(int o,int p);    //矩陣的初始化賦值
		void print()const;
		void generate();    //保存轉(zhuǎn)置后的矩陣
		void get_three();    //獲得計(jì)算結(jié)束的三元組
		int get_m()const;    
		int get_n()const;
		ju Invert(ju y,ju c);    //轉(zhuǎn)置函數(shù)
		ju& add(ju c,ju &y);    //矩陣加法
		ju& minus(ju c,ju &y);    //矩陣減法
		ju& multi(ju c,ju &y);    //矩陣乘法
};

加減法的函數(shù)內(nèi)容如下所示:

?其中的運(yùn)算最容易實(shí)現(xiàn)的就是加減法,本人采取類成員函數(shù)的方式來進(jìn)行計(jì)算,使用一個(gè)類的引用使其可以在函數(shù)體內(nèi)部對(duì)其本身進(jìn)行修改返回一個(gè)引用值可以避免程序開辟一個(gè)臨時(shí)變量來浪費(fèi)內(nèi)存。具體的實(shí)現(xiàn)內(nèi)容則是進(jìn)行循環(huán)將其相應(yīng)位置進(jìn)行加減法的運(yùn)算即可

ju & ju::add(ju c,ju &y) 
{
	int m1,n1;
	m1=c.get_m();
	n1=c.get_n();
	if(m!=m1||n!=n1){
		cout<<"您輸入的矩陣格式不匹配\n";
		return *this;
	} 
	for(int i=1;i<=m;i++)
	{
		for(int j=1;j<=n;j++)
		{
			y.juzhen[i][j]=juzhen[i][j]+c.juzhen[i][j];
		}
	}
	return y;
}

ju & ju::minus(ju c,ju &y)
{
	int m1,n1;
	m1=c.get_m();
	n1=c.get_n();
	if(m!=m1||n!=n1){
		cout<<"您輸入的矩陣格式不匹配\n";
		return *this;
	} 
	for(int i=1;i<=m;i++)
	{
		for(int j=1;j<=n;j++)
		{
			y.juzhen[i][j]=juzhen[i][j]-c.juzhen[i][j];
		}
	}
	return y;
} 

乘法的函數(shù)如下:

該函數(shù)實(shí)現(xiàn)的功能是矩陣的乘法,我們?cè)诰€性代數(shù)中學(xué)習(xí)到的只有當(dāng)前一項(xiàng)的列等于后一項(xiàng)的行時(shí)才可以進(jìn)行相關(guān)的乘法,并且乘法規(guī)律則是第一行乘以第一列并且求和等于結(jié)果矩陣的1,1位置第一行乘以對(duì)應(yīng)相乘第二列并且求和等于1.2位置以此類推。大家可以在紙上進(jìn)行驗(yàn)算之后可知需要三次循環(huán)來存儲(chǔ)結(jié)果的內(nèi)容,其內(nèi)容如下所示。

ju& ju::multi(ju c,ju &y)
{
	if(n!=c.m)
		cout<<"您輸入的格式存在問題無法進(jìn)行計(jì)算\n";
	for(int i=1;i<=m;i++)
	{
		for(int j=1;j<=c.n;j++)
		{
			for(int k=1;k<=c.m;k++)
				y.juzhen[i][j]+=juzhen[i][k]*c.juzhen[k][j];
		}         
	}
	return y;
}

下來是轉(zhuǎn)置并且保存結(jié)果矩陣的:

下面是稀疏矩陣的快速轉(zhuǎn)置的實(shí)現(xiàn),我們首先要定義兩個(gè)數(shù)組來存儲(chǔ)每一列具有多少個(gè)元素并且記錄該列將轉(zhuǎn)置到三元組的第幾個(gè)位置,num數(shù)組則是存儲(chǔ)一列具有多少個(gè)元素,position將記錄轉(zhuǎn)置到第幾個(gè)位置。generate()則是獲取存儲(chǔ)該結(jié)果的矩陣。

?C++數(shù)據(jù)結(jié)構(gòu)稀疏矩陣運(yùn)算(含加減乘及快速轉(zhuǎn)置)

?

void ju::generate()
{
	int k,i,j;
	juzhen[10][10]={0};
	for(k=1;k<=len;k++){
		i=a[k].i;
		j=a[k].j;
		juzhen[i][j]=a[k].x;	
	}
}
ju ju::Invert(ju y,ju c)
{
	int a,b;
	int num[20],position[20];
	for(a=1;a<=c.len;a++)
	{
		num[a]=0;
		position[a]=0;		
	}
	for(a=1;a<=c.m;a++)
	{
		for(b=1;b<=c.n;b++)
		{
			if(juzhen[b][a]!=0)
			{
				num[b]++;
			}
		}
	}
	position[1]=1;
	for(a=2;a<=len;a++)
	{
		position[a]=num[a-1]+position[a-1];
	}
	for(b=1;b<=c.len;b++)
	{
		int col=c.a[b].j;
		int q=position[col];
		y.a[q].i=c.a[b].j;
		y.a[q].j=c.a[b].i;
		y.a[q].x=c.a[b].x;
		y.len++;
		y.m=c.n;
		y.n=c.m;
		++position[col];
	}
	return y;
}

整體性的代碼如下所示,如果需要取走的朋友們請(qǐng)給個(gè)贊或者留個(gè)言謝謝

#include<iostream>
using namespace std;
int flag1=1;
int flag2=1;
int flag3=1;
class ju{
	struct shu{
		int i,j;
		int x;
	};
	int m,n;
	int len;
	shu a[25];
	public:
		int juzhen[10][10];
		ju(int o,int p);
		void print()const;
		void print1()const;
		void generate();
		void get_three();
		int get_m()const;
		int get_n()const;
		ju Invert(ju y,ju c);
		ju& add(ju c,ju &y);
		ju& minus(ju c,ju &y);
		ju& multi(ju c,ju &y);
};

void ju::get_three()
{
	int i,j;
	int k=1;
	for(i=1;i<=m;i++)
	{
		for(j=1;j<=n;j++)
		{
			if(juzhen[i][j]!=0)
			{
				len++;
				a[k].i=i;
				a[k].j=j;
				a[k].x=juzhen[i][j];
				k++;
			}
		}
	}
}

ju::ju(int o,int p)	//初始化 
{
	m=o;
	n=p;
	len=0;
	int j,i;
	cout<<"請(qǐng)輸入矩陣各個(gè)點(diǎn)的數(shù)字:\n";
	for(i=1;i<=o;i++)
	{
		for(j=1;j<=p;j++)
		{
			cin>>juzhen[i][j];
		}
	}
}

int ju::get_m()const
{
	return m;
}

int ju::get_n()const
{
	return n;
}

ju & ju::add(ju c,ju &y) 
{
	int m1,n1;
	m1=c.get_m();
	n1=c.get_n();
	if(m!=m1||n!=n1){
		cout<<"您輸入的矩陣格式不匹配\n";
		flag1=0;
		return *this;
	} 
	for(int i=1;i<=m;i++)
	{
		for(int j=1;j<=n;j++)
		{
			y.juzhen[i][j]=juzhen[i][j]+c.juzhen[i][j];
		}
	}
	return y;
}

ju & ju::minus(ju c,ju &y)
{
	int m1,n1;
	m1=c.get_m();
	n1=c.get_n();
	if(m!=m1||n!=n1){
		cout<<"您輸入的矩陣格式不匹配\n";
		flag2=0;
		return *this;
	} 
	for(int i=1;i<=m;i++)
	{
		for(int j=1;j<=n;j++)
		{
			y.juzhen[i][j]=juzhen[i][j]-c.juzhen[i][j];
		}
	}
	return y;
} 

ju& ju::multi(ju c,ju &y)
{
	if(n!=c.m){
		cout<<"您輸入的格式存在問題無法進(jìn)行計(jì)算\n";
		flag3=0;
	}
	for(int i=1;i<=m;i++)
	{
		for(int j=1;j<=c.n;j++)
		{
			for(int k=1;k<=c.m;k++)
				y.juzhen[i][j]+=juzhen[i][k]*c.juzhen[k][j];
		}         
	}
	return y;
}

void ju::print()const 	//對(duì)矩陣和三元組進(jìn)行打印 
{
	cout<<"矩陣結(jié)果如下:\n";
	for(int i =1;i<=m;i++)
	{
		for(int j=1;j<=n;j++)
		{
			cout<<juzhen[i][j]<<" ";
		}
		cout<<endl;
	}
	cout<<endl;
	cout<<"上述矩陣的三元組表示如下:\n";
	for(int k=1;k<=len;k++)
	{
		cout<<a[k].i<<" "<<a[k].j<<" "<<a[k].x<<endl;
	}
}

void ju::generate()
{
	int k,i,j;
	juzhen[10][10]={0};
	for(k=1;k<=len;k++){
		i=a[k].i;
		j=a[k].j;
		juzhen[i][j]=a[k].x;	
	}
}
ju ju::Invert(ju y,ju c)
{
	int a,b;
	int num[20],position[20];
	for(a=1;a<=c.len;a++)
	{
		num[a]=0;
		position[a]=0;		
	}
	for(a=1;a<=c.m;a++)
	{
		for(b=1;b<=c.n;b++)
		{
			if(juzhen[b][a]!=0)
			{
				num[b]++;
			}
		}
	}
	position[1]=1;
	for(a=2;a<=len;a++)
	{
		position[a]=num[a-1]+position[a-1];
	}
	for(b=1;b<=c.len;b++)
	{
		int col=c.a[b].j;
		int q=position[col];
		y.a[q].i=c.a[b].j;
		y.a[q].j=c.a[b].i;
		y.a[q].x=c.a[b].x;
		y.len++;
		y.m=c.n;
		y.n=c.m;
		++position[col];
	}
	return y;
}

int main()
{
	int m1,n1,x,m2,n2;
	char c;
	cout<<"請(qǐng)輸入第一個(gè)矩陣的格式:\n";
	cin>>m1>>n1;
	ju b(m1,n1);
	b.get_three();
	b.print();
	cout<<"請(qǐng)輸入第二個(gè)矩陣的格式:\n";
	cin>>m2>>n2;
	ju d(m2,n2);
	d.get_three();
	cout<<"是否要進(jìn)行矩陣的運(yùn)算:\n";
	cin>>c;
	while(c=='y'||c=='Y')
	{
		cout<<"運(yùn)算如下:"
		<<"1.矩陣加法add."
		<<"2.矩陣減法minus."
		<<"3.矩陣乘法."
		<<"4.矩陣逆置."<<endl;
		cout<<endl; 
		cout<<"請(qǐng)輸入您要選擇的運(yùn)算:";
		cin>>x; 
		if(x==1){
			cout<<"請(qǐng)輸入結(jié)果矩陣的各個(gè)元素必須定義為0\n";
			ju y(m1,n1);
			y=b.add(d,y);
			if(flag1==0)
				continue;
			y.get_three();
			cout<<"矩陣加法的結(jié)果為:\n"; 
			y.print();
		}
		else if(x==2){
			cout<<"請(qǐng)輸入結(jié)果矩陣的各個(gè)元素必須定義為0\n";
			ju a(m1,n1);
			a=b.minus(d,a);
			if(flag2==0)
				continue;
			a.get_three();
			cout<<"矩陣減法的結(jié)果為:\n";
			a.print();
		}
		else if(x==3){
			cout<<"請(qǐng)輸入結(jié)果矩陣的各個(gè)元素必須定義為0\n";
			ju g(m1,n2);
			g=b.multi(d,g);
			if(flag3==0)
				continue;
			g.get_three();
			cout<<"矩陣乘法的結(jié)果為:\n";
			g.print();
		}
		else if(x==4){
			ju h(m1,n1);
			h=b.Invert(h,b);
			h.generate();
			h.print();
		}
		cout<<"是否要繼續(xù)進(jìn)行矩陣的運(yùn)算:\n";
		cin>>c;
	}
}

運(yùn)行的內(nèi)容結(jié)果如下:C++數(shù)據(jù)結(jié)構(gòu)稀疏矩陣運(yùn)算(含加減乘及快速轉(zhuǎn)置)

?C++數(shù)據(jù)結(jié)構(gòu)稀疏矩陣運(yùn)算(含加減乘及快速轉(zhuǎn)置)

?C++數(shù)據(jù)結(jié)構(gòu)稀疏矩陣運(yùn)算(含加減乘及快速轉(zhuǎn)置)

?C++數(shù)據(jù)結(jié)構(gòu)稀疏矩陣運(yùn)算(含加減乘及快速轉(zhuǎn)置)

?C++數(shù)據(jù)結(jié)構(gòu)稀疏矩陣運(yùn)算(含加減乘及快速轉(zhuǎn)置)

下面是一些測試錯(cuò)誤的案例:?

C++數(shù)據(jù)結(jié)構(gòu)稀疏矩陣運(yùn)算(含加減乘及快速轉(zhuǎn)置)

?本篇內(nèi)容到此結(jié)束,有需要借走的朋友請(qǐng)留下點(diǎn)痕跡嘿嘿。文章來源地址http://www.zghlxwxcb.cn/news/detail-409271.html

到了這里,關(guān)于C++數(shù)據(jù)結(jié)構(gòu)稀疏矩陣運(yùn)算(含加減乘及快速轉(zhuǎn)置)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?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)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

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

相關(guān)文章

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包