# مهندسی نرم افزار > مباحث مرتبط با مهندسی نرم‌افزار > الگوریتم، کامپایلر، هوش مصنوعی و ساختمان داده ها > آموزش: پیاده سازی ماتریس اسپارس , ترانهاده و جمع دو ماتریس اسپارس

## amin.m1993

سلام .
امروز میخوام براتون پیاده سازی اسپارس رو توضیح بدم.
اول از همه باید بدونید ماتریس اسپارس ماتریسی است که اکثر cell های اون یک مقدار ثابت (که ما میگیم صفر) بوده و بقیه ی عناصر غیر صفرند(که اینها رو استثنا میگیم).

الگوریتمی که ما ازش استفاده میکنیم اینه که یه آرایه ی دو بعدی به صورت 3*(tedadestesna+1) تعریف میکنیم و سطر 0 ام این آرایه رو با مشخصات ماتریس اسپارسمون پر میکنیم(جلوتر با کد کامل توضیح میدم).

با این مقدمه میریم سر پیاده سازی.
ابتدا یک کلاس با اسم Espars می سازیم , یک متغیر از نوع int که تعداد استثنا ها رو در خودش نگه میداره (حالتهایی که غیر صفرند) و بعد یه اشاره گر به صورت زیر:

int **value;

در این قسمت سازنده ی کلاس رو تعریف میکنیم:
Espars(int TedadEstesna,int Satr,int Sotun,int MeghdarKolli)
	{
		tedadEstesna=TedadEstesna;
		value=new int*[tedadEstesna+1];
		for(int i=0;i<tedadEstesna+1;i++)
		{
			value[i]=new int[3];
		}
		value[0][0]=Satr;
		value[0][1]=Sotun;
		value[0][2]=MeghdarKolli;
	}
سازنده تعداد کل حالتهای استثنا رو میگشره و اونو تو متغیر داخل کلاس (tedadEstesna) میزاره.
بعد همون طور که گفتم آرایه پویا دو بعدی تعریف میکنه (tedadEstesna+1)*3)) و بعدش سطر 0 ام رو با مشخصات ماتریس مقداردهی میکنه .منظور از meghdarkolli همون صفره.الان ما یه آرایه دو بعدی داریم و مقادیر (حالتهای استثنا) رو از سطر 1 هم به بعد توش قرار خواهیم داد.(طبق قرارداد !)

یه تابع هم برای دریافت مقادیر ماترسی مینویسیم به صورت زیر:
void Daryaft()
	{
		for(int i=1;i<tedadEstesna+1;i++)
		{
			cout<<i<<")\nSatr: ";
			cin>>value[i][0];
			cout<<"Sotun: ";
			cin>>value[i][1];
			cout<<"Meghdar: ";
			cin>>value[i][2];
			cout<<"\n";
		}
	}

حالا نوبت میرسه به جمع دو ماتریس اسپارس که من اول کدشو قرار میدم و بعد توضیح میدم:

Espars operator +(Espars b)
	{
		if(value[0][0]!=b.value[0][0] || value[0][1]!=b.value[0][1])
		{
			cout<<"in 2 matris daraye satr va sotune barabar nistand";
			return *new Espars(0,0,0,0);
		}
		int tekrari=0;
		for(int i=1;i<tedadEstesna+1;i++)
		{
			for(int j=0;j<b.tedadEstesna+1;j++)
			{
				if(value[i][0]==b.value[j][0] && value[i][1]==b.value[j][1])
				{
					tekrari++;
					break;
				}
			}
		}
		Espars sum=Espars(tedadEstesna+b.tedadEstesna-tekrari,value[0][0],value[0][1],value[0][2]+b.value[0][2]);
		int index;
		for(index=1;index<tedadEstesna+1;index++)
		{
			sum.value[index][0]=value[index][0]+0;
			sum.value[index][1]=value[index][1]+0;
			sum.value[index][2]=value[index][2]+0;
		}
		for(int i=1;i<b.tedadEstesna+1;i++)
		{
			int j=0;
			for(j=1;j<tedadEstesna+1;j++)
			{
				if(b.value[i][0]==sum.value[j][0] && b.value[i][1]==sum.value[j][1])
				{
					sum.value[j][2]=value[j][2]+b.value[i][2];
					break;
				}
			}
			if(j==tedadEstesna+1)
			{
				sum.value[index][0]=b.value[i][0];
				sum.value[index][1]=b.value[i][1];
				sum.value[index++][2]=b.value[i][2];
			}
		}
		return sum;
	}

خوب و اما توضیح:
در اینجا باید از طریق همون مشخصات ماتریس (سطر 0 ام) باید بررسی بشه که آیا دو ماترسی میتونند با هم جمع بشد یا نه:
if(value[0][0]!=b.value[0][0] || value[0][1]!=b.value[0][1])
		{
			cout<<"in 2 matris daraye satr va sotune barabar nistand";
			return *new Espars(0,0,0,0);
		}

حالا باید حالتهای تکراری رو حذف کنیم.منظور از حالتهای تکراری اینه که سطر و ستون یه فیلد از هر دو ماتریس برابر باشند که باید در ماتریس جدید اونا رو جمع کنیم:
int tekrari=0;
		for(int i=1;i<tedadEstesna+1;i++)
		{
			for(int j=0;j<b.tedadEstesna+1;j++)
			{
				if(value[i][0]==b.value[j][0] && value[i][1]==b.value[j][1])
				{
					tekrari++;
					break;
				}
			}
		}

حالا یه ماترس اسپارس جدید ایجاد میکنیم به تعداد مجموع استثناهای دو ماتریس اول منهای تعداد تکراری که در قسمت قبل پیدا کریم بعدش ماترسی اول رو همون طور که هست در ماترس جدید جایگذاری میکنیم:
Espars sum=Espars(tedadEstesna+b.tedadEstesna-tekrari,value[0][0],value[0][1],value[0][2]+b.value[0][2]);
		int index;
		for(index=1;index<tedadEstesna+1;index++)
		{
			sum.value[index][0]=value[index][0];
			sum.value[index][1]=value[index][1];
			sum.value[index][2]=value[index][2];
		}

در قسمت بعد هم که بررسی میکنیم اگه تکراری باشه جمع کن اگه نباشه ماتریس b رو هم بزار داخل sum.

ترانهاده اش هم که جاس سطر و ستون عوض میشه و خیلی راحته:

Espars Taranahadeh()
	{
		Espars taranahadeh=*new Espars(tedadEstesna,value[0][1],value[0][0],value[0][2]);
		for(int i=1;i<tedadEstesna+1;i++)
		{
			taranahadeh.value[i][0]=value[i][1];
			taranahadeh.value[i][1]=value[i][0];
			taranahadeh.value[i][2]=value[i][2];
		}
		return taranahadeh;
	}

در آخر خود برنامه رو هم قرار میدم تا استفاه کنید.
Espars.rar
خوب دوستان موفق باشید انشا الله اگه وقت شد ضربشو هم براتون میزارم.
یا حق.

----------

