PDA

View Full Version : سوال: بهینه سازی ماتریس اسپارس



mehrayaneh
سه شنبه 15 فروردین 1391, 04:24 صبح
با سلام
من دانشجوی ترم دو فناوری اطلاعاتم استادمون یه تمرین بهمون داد که ماتریس اسپارس رو بهینه سازی کنیم من تقریبا همه ی مراحل رو انجام دادم ام وقتی از برنامه اجرا میگیرم برنامه زود میاد و میره و رو صفحه باقی نمیمونه
در ضمن نرم افزارم dev C++‎ 4.9.9.2 هستش لطفا کمکم کنین ممنون
متن برنامه ای که نوشتم:
اینم فایلtxt :دانلود 1.8 کیلوبایت (http://parsaspace.com/files/8459654884/spars.txt.html)


#include<iostream.h>
#include<conio.h>
int main()
{
int i,j,k,v,p,x[i][j],y[v][3],a=0;
cout<<"lotfan tedade setrha va sotoon ha ra vared konid";
cout<<"/n tedade satr=/t";
cin>>i;
cout<<"/ntedade sotoon=/t";
cin>>j;
cout<<"lotfan adad ra vared konid (dadehaye araye)tedade adad barabare khanehaye araye ast /n";
for(k=0;k=i-1;k++)
{
for(p=0;p=j-1;p++)
{
cin>>x[k][p];
}
}
for(k=0;k=i-1;k++)
{
for(p=0;p=j-1;p++)
{
if(x[k][p]!=0)
{
y[a][0]=k;
y[a][1]=p;
y[a][2]=x[k][p];
a++;
}
else;
}
}
for(k=0;k=a;k++)
{
for(p=0;p=2;p++)
{
cout<<y[k][p]<<"/t"<<y[k][p]<<"/t"<<y[k][p];
}
cout<<"/n";
}
getch();
return 0;
}

jannatmakan
سه شنبه 15 فروردین 1391, 04:50 صبح
خوب نکته ی اولی که در سورس شما مشاهده می شه . اینه که شمادر خط اولِ تابع main، طولِ اندیس آرایه رو یک متغیر دادید. ,x[i][j],y[v][3 . در صورتی که هنوز i , j , v مقدار اولیّه ندارند.
و برنامتون اصلاً نبایدم اجرا بشه. تازه اگر مقدار اولیه هم داشته باشند؛ باز هم نمی شه در هنگام تعریف آرایه ، طول آرایه رو غیر از عدد گذاشت . مگر اینکه، از اشاره گرها استفاده کرد.

و دوم اینکه آیا منظورتون از بهینه سازی اسپارس ، بدست آوردن ماتریس شبه اسپارس آن است ؟
چون ماتریس اسپارس ماتریسی است که اکثر عناصر آن صفر است . پس احتمالاً منظور شما شبه اسپارس اونه . درسته ؟

mehrayaneh
سه شنبه 15 فروردین 1391, 12:57 عصر
سلام
ممنون از راهنمایی تون به ما که یاد میدادن گفتن بهینه سازی ماتریس اسپارس یعنی یه ماتریس با 3 ستون و x سطر که وقتی تو برنامه ماتریس اسپارس رو پیمایش میکنیم آدرس خونه های غیر صفر رو تو ماتریس جدید ذخیره میکنه به صورتی که تو ستون اول هر سطر سطری که اون عدد توش قرار گرفته تو ستون دوم ستونی که توش قرار گرفته و در ستون سوم خود عدد قرار میگیره در ضمن اگه متغیر ندم چطوری تعریفش کنم تو برنامه y[3][] رو ارور میداد مجبور شدم ر بزارم دیگه ارور نمیداد در ضمن ما میتونیم یه ماتریس نامحدود ایجاد کنیم بعد تو یه جای دیگه محدودش کنیم؟

m.khani_121
سه شنبه 15 فروردین 1391, 13:25 عصر
سلام
ممنون از راهنمایی تون به ما که یاد میدادن گفتن بهینه سازی ماتریس اسپارس یعنی یه ماتریس با 3 ستون و x سطر که وقتی تو برنامه ماتریس اسپارس رو پیمایش میکنیم آدرس خونه های غیر صفر رو تو ماتریس جدید ذخیره میکنه به صورتی که تو ستون اول هر سطر سطری که اون عدد توش قرار گرفته تو ستون دوم ستونی که توش قرار گرفته و در ستون سوم خود عدد قرار میگیره در ضمن اگه متغیر ندم چطوری تعریفش کنم تو برنامه y[3][] رو ارور میداد مجبور شدم ر بزارم دیگه ارور نمیداد در ضمن ما میتونیم یه ماتریس نامحدود ایجاد کنیم بعد تو یه جای دیگه محدودش کنیم؟

داداش اگه میخوای تو اجرا برنامه سطر و ستون ماتریس رو مقدار بدی باید از اشاره گرا استفاده کنی . مثلا :

int *x;
x=new int[m][n];

مثلا میتونی اول طول ماتریس اسپارس رو بدی ، بعد وقتی میخوای تو ماتریس جدید بریزی بر اساس مقادیر غیر صفر ، سطر و ستون ماتریس جدید رو کم و زیاد کن .

mehrayaneh
سه شنبه 15 فروردین 1391, 13:38 عصر
ممنون ولی من نفهمیدم چرا دستور y[][3] رو قبول نمیکرد و سوال اصلیم اینه که چرا برنامه رو صفحه باقی نمیمونه؟

m.khani_121
سه شنبه 15 فروردین 1391, 13:43 عصر
ممنون ولی من نفهمیدم چرا دستور y[][3] رو قبول نمیکرد و سوال اصلیم اینه که چرا برنامه رو صفحه باقی نمیمونه؟

[3][y] رو به این دلیل قبول نمیکنه چون شما این ماتریس رو به صورت پویا تعریف نکردی ... شما نمیتونی بعد از اینکه برنامه اجرا شد به داده های غیر پویا مقدار بدی چون حافظه اونا داده شده و غیره قابله تغییره . ولی وقتی با اشاره گرا تعریف کنی میتونی تو زمان اجرا برنامه هر مقدار دلخواهی رو بدی .

صفحه باقی نمیمونه چون اصلا برنامه هنوز ناقصه و درست تعریف نشده ... یا ببین error getch() نداری ؟؟

mehrayaneh
سه شنبه 15 فروردین 1391, 13:48 عصر
اصلا ارور ندارم
مثل اینکه بد نوشتم
y[][3]
رو اجرا نمیکنه و اخطار میده
و
y[v][3]
رو بدون اخطار اجرا میکنه

m.khani_121
سه شنبه 15 فروردین 1391, 13:58 عصر
داداش این کدی که شما نوشتی از پایه اشتباه است . شما کاری به باز شدن پنجره یا نشدنش نداشته باش. اول کد برنامه رو اصلاح کن .

mehrayaneh
سه شنبه 15 فروردین 1391, 14:02 عصر
دوست عزیز منم فهمیدم اشتباهه نمیفهمم کجاش اشتباهه؟

m.khani_121
سه شنبه 15 فروردین 1391, 14:11 عصر
ببین اول بیا تعریف ماتریس ها رو پاک کن و اینا رو بزار :
int *x;
cin>>i;
cin>>j;
x=new int[i][j];

این برا تعریف ماتریس اسپارس . حالا بیا تعداد مقادیر غیر صفر رو اول با یه counter بشمار بعد :

int *y;
y=new int [counter][3]

این از تعریف 2تا ماتریس . حالا بیا سطر و ستون و خود مقدار غیر صفر رو از ماتریس اسپارس بریز تو ماتریس جدید . این دیگه کدش با خودت .

mehrayaneh
سه شنبه 15 فروردین 1391, 16:17 عصر
این با اشاره گره؟
ما اونو نخوندیم هنوز اگه میشه یه کم راهنمایی بیشتر بکن در باره شون

m.khani_121
سه شنبه 15 فروردین 1391, 21:42 عصر
http://www.hpkclasses.ir/Courses/DataStructure/ds0400.html

داداش اینجا یه توضیحاتی داده . ولی مبحث اشاره گرها خیلی جامع هست . در همین حد تو این لینک توضیح داده . . .

mehrayaneh
سه شنبه 15 فروردین 1391, 22:00 عصر
من برنامه رو اینطوری نوشتم باگ داره نمیدونم چیکار کنم با اشاره گر هم نوشته بودم ارور میداد

#include<iostream.h>
#include<conio.h>
int main()
{
int i,j,k,p,a=0,v=0;
cout<<"lotfan tedade setrha va sotoon ha ra vared konid";
cout<<"\n tedade satr=\t";
cin>>i;
cout<<"\ntedade sotoon=\t";
cin>>j;
int x[i][j];
cout<<"\nlotfan adad ha ra vared konid (dadehaye araye)tedade adad barabare khanehaye araye ast \n";
for(k=0;k<i;k++)
{
for(p=0;p<j;p++)
{
cin>>x[k][p];
if(x[k][p]!=0)
v=v+1;
}
}
int y[v][3];
for(k=0;k<i;k++)
{
for(p=0;p<j;p++)
{
if(x[k][p]!=0)
{
y[a][0]=k;
y[a][1]=p;
y[a][2]=x[k][p];
a++;
}
else;
}
}
for(k=0;k=a;k++)
{
for(p=0;p=2;p++)
{
cout<<y[k][p]<<"\t"<<y[k][p]<<"\t"<<y[k][p];
}
cout<<"\n";
}
getch();
return 0;
}

m.khani_121
سه شنبه 15 فروردین 1391, 22:06 عصر
دوباره همون اشتباه قبلی. اگه اینجوری بخوای بنویسی i, j باید قبل اجرا مقدار داشته باشن . اگه مثله اون کد قبلی که من نوشتم با اشاره گرا فکر نکنم اررور بده !

mehrayaneh
سه شنبه 15 فروردین 1391, 22:54 عصر
نه اول به اونا مقدار دادم بعد آرایه شون رو تعریف کردم اما باگش چیز دیگه ست شایدم اشتباه داشته باشم اما فعلا این باگ نمیزاره ایرادای دیگه شو ببینم
اینم فایلش exe برنامه (دانلود) (http://parsaspace.com/files/0353654884/?c=1151) باید مال ساختار شرطی آخر باشه

#include<iostream.h>
#include<conio.h>
int main()
{
int i,j,k,p,a=0,v=0;
cout<<"lotfan tedade setrha va sotoon ha ra vared konid";
cout<<"\n tedade satr=\t";
cin>>i;
cout<<"\ntedade sotoon=\t";
cin>>j;
int x[i][j];
cout<<"\nlotfan adad ha ra vared konid (dadehaye araye)tedade adad barabare khanehaye araye ast \n";
for(k=0;k<i;k++)
{
for(p=0;p<j;p++)
{
cin>>x[k][p];
if(x[k][p]!=0)
v=v+1;
}
}
int y[v][3];
for(k=0;k<i;k++)
{
for(p=0;p<j;p++)
{
if(x[k][p]!=0)
{
y[a][0]=k;
y[a][1]=p;
y[a][2]=x[k][p];
a=a+1;
}
else;
}
}
for(k=0;k<v;k++)
{
if(v<k)
break;
for(p=0;p=2;p++)
{
cout<<y[k][p]<<"\t";
}
cout<<"\n";
}
getch();
return 0;
}

mehrayaneh
چهارشنبه 16 فروردین 1391, 00:30 صبح
دوستان خواهشا کمک کنید من همین 19 فروردین باید جوابو تحویل استاد بدم