PDA

View Full Version : سوال: هر کی بلده لطفا یه راهنمایی بکنه (ماتریس ها)



aminwxy
پنج شنبه 24 مرداد 1387, 10:03 صبح
من یه برنامه می خواستم بنویسم که وقتی اعداد یه ماتریس به برنامه میدیم به ما بگه که این ماتریس هم ارزی هست یا نه و مشخص کنه ویژگی های بازتابی و تقارنی و تعدی رو
توش موندم !
میتونه با سی یا سی++

esshahab
پنج شنبه 24 مرداد 1387, 19:16 عصر
با سلام
من به همراه یکی از دوستانم در نظر داشتیم که یک ماتریس،که از هر لحاظی کارآمد باشد را بنویسیم. که حتی بتواند ضرب های n*n را هم انجام دهد.
از الگوریتم خاصی هم استفاده کردیم. مدتی است که تست آن به تعویق افتاده است
اگر مایل باشید می توانیم با همکاری خودتان، نظرات شما را هم به آن اضافه کنیم و کلاس ماتریس را کاملتر کنیم.
منتظر جواب هستم.

aminwxy
پنج شنبه 24 مرداد 1387, 19:22 عصر
یه کم بیشتر توضیح بدین و بگین که چیکار باید بکنم

esshahab
پنج شنبه 24 مرداد 1387, 19:28 عصر
خوب شما که می خواهید این برنامه را بنویسید لابد شی گرایی بلدید!؟
یک سری توضیحات هم در مورد کارمون باید به شما بدیم
می تونید با آی دی های saba_r_g یا esshahab در یاهو مسنجر با ما در تماس باشید تا بیشتر راهنمایی کنیم

RF.Ariyapoor
پنج شنبه 24 مرداد 1387, 20:46 عصر
بچه ها من برنامه sparse matrix رو نوشتم که میتونه ضرب های ماتریس های 1000 *1000 و بیشتر رو هم حساب کنه

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


موفق باشید

bsng110
پنج شنبه 24 مرداد 1387, 21:07 عصر
هوالحکیم
سلام
حقیقتش برنامه ما یک کلاس ماتریس در ++C بود که به صورت دینامیک ساخته می شد و می شد اندازه ماتریس را تغییر هم داد. ماتریس ما در اصل یک آرایه بود. اعمال جمع و تفریق و ضرب ماتریس ها را هم براش پیاده سازی کرده بودیم. دترمینان و ماتریس معکوس را هم نوشته بودیم. یه سری متد هم برای تشخیص ماتریس های ویژه مانند ماتریس صفر و بالا مثلثی و ... مثل اینکه داشت. یک سری ماتریس های به خصوص مانند ماتریس قطری و .. را هم نوشته بودیم. اما دیگه حواسمون به این مواردی که دوست عزیزمون گفتند یعنی هم ارزی نبود. حالا یک کلاس هم برای اون می نویسیم. اما در مورد این دوست عزیز که گفتند ماتریس اسپارس را نوشتند که می تواند یک دو ماتریس 1000*1000 را در هم ضرب کند، می توانید بیشتر توضیح دهید؟ چگونه؟ منظورتان از ماتریس اسپارس چیست؟ شما چه مقادیری از این ماتریس را ذخیره می کنید؟ روش ذخیره سازی شما چگونه است؟
دوستمون aminwxy هم لطف کنن یک کم بیشتر توضیح بدن که دقیقاً چی می خواهند؟ یک برنامه؟ یا کمک؟ یا اینکه قصد دارند خودشان نیز به ما کمک کنند تا با هم این کد ها را بنویسیم؟
اما در مورد هم ارزی باید بگویم که:
اولاً ماتریس باید حتماً مربعی باشد!
در مورد ماتریس بازتابی که کافیست عناصر قطر را بررسی کنیم و چنانچه همه یک بودند، ماتریس بازتابی است.
در مورد ماتریس متقارن که دو حلقه for تو در تو می گذاریم و بالا و پایین قطر را بررسی می کنیم. قطر هم مهم نیست. با یک if ساده بررسی می کنیم که اگر [a[i][j]!=a[j][i بود، ماتریس بازتابی نیست و الا هست.
در مورد ماتریس تعدی هم مثل بررسی ماتریس متقارن عمل می کنیم. با این شرط که چنانچه [a[i][j یک بود و به ازای k از 0 تا n-1 هم [a[j][k یک بود، باید [a[i][k هم یک باشد. یعنی سه تا حلقه for تو در تو نیاز داریم که دو حلقه اول برای پیمایش مثلی ماتریس(مثلاً پایین مثلث) استفاده می شوند و حلقه دوم و سوم هم برای پیمایش مثلثی طرف دیگر ماتریس(مثلاً بالای ماتریس) استفاده می شوند.
ساده ترین کار هم این است که در ابتدا سه متغییر bool به نام بازتابی و تقارنی و تعدی تعریف کنید و بعدش حلقه های بالا را بنویسد و بعدش نتایج را چاپ کنید.
البته هنر اینه که به جای استفاده از سه پارامتر از یک Enum استفاده کنید و به جای استفاده از این شش حلقه فقط از سه حلقه استفاده کنید! این دیگه آخر برنامه می شه.
کمکی خواستید در خدمتیم.
یا علی
خدانگهدارتون

RF.Ariyapoor
جمعه 25 مرداد 1387, 01:38 صبح
در مورد ماتریس اسپارس که گفتم این بحث تو ساختمان داده ها مطرح شده بود واسمون

ماتریس اسپارس یا ماتریس خلوت به ماتریسی میگن که بیشتر عناصرش صفر هست

حالا ما واسه بهینه کردن فضای ذخیره شده و زمان در محاسبات میایم صفر ها رو در نظر نمیگیریم. البته بحث ماتریس های خلوت مفصل تره و من الان نمیتونم کامل توضیحش بدم

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

ورودی برنامه هم از اونجایی که مثلا نمیشه یه ماتریس ۱۰۰۰*۱۰۰۰ رو دستی وارد کرد یه برنامه کوچیک هم واسه تولید ماتریس نوشتم که اولش یه درصدی از کاربر میپرسه که این درصد نسبت عناصر غیر صفر به عناصر صفر هستش و این اطلاعات رو تو یه فایل ذخیره میکنه و برنامه اصلی اون اطلاعات رو از اون فایل میخونه.

aminwxy
جمعه 25 مرداد 1387, 23:43 عصر
با سلام خدمت جناب bsng110
راستش اگه بتونین همین برنامه رو که گفتین با C++ همین جا بیاریدش ممنون می شم
چون خودم ناقص نوشتمش ...:متفکر:

aminwxy
جمعه 25 مرداد 1387, 23:45 عصر
آقای RF.Ariyapoor این برنامه رو که گفتین اگه می شه همین جا بیارین تا ما هم ببینیمش تا بشه یه اظهار نظری بکنیم.:متفکر:

bsng110
شنبه 26 مرداد 1387, 16:23 عصر
هوالحکیم
سلام
ببخشید که دیر شد. اصفهان نبودم.
کد تابع هم ارزی که شما می خواستید به صورت زیر نوشتم. این کد تقریباً بهینه شده است ولی دو مشکل دارد. اول اینکه trace نشده است و من در notepad آن را نوشتم پس یک مرتبه آن را بررسی کنید که درست باشد. خروجی این تابع مشخص می کند که ماتریس m ورودی هم ارزی هست با خیر؟ پارامتر دوم، اندازه ماتریس و پارامتر های سوم تا پنجم هم مشخص می کنند که ماتریس بازتابی و تقارنی و ... هستند یا خیر. شرمنده که اصطلاحات انگلیسی آنها را نمی دانستم به همین دلیل فینگلیش نوشتم. دومین مشکل این تابع هم نحوه مشخص کردن بازتابی و ... بودن است که بهتر بود از enum استفاده می کردم ولی چونکه می خواستم برنامه دارای درک ساده و راحت تری باشد، از آن روش استفاده نکردم. در ضمن همانطور که می بینید، در زیر فقط سه حلقه تو در تو وجود دارد که شما می توانید آنها را جداکنید و در شش حلقه قرار دهید به طوری که بررسی هر شرط، به صورت جداگانه صورت گیرد.


bool HamArzy(bool **m, unsigned size, bool &baztab, bool &tagharony, bool &tarayaee)
{
baztab = tagharony = tarayaee = true;
int i,j,k,midSize = size/2;
for(i = 0 ; i < size ; ++i)
{
if(!m[i][i])
baztab = false;
for(j = 0 ; j < midSize ; ++j)
{
if(m[i][j]^m[j][i])
tagharony = false;
for(k = 0 ; k < midSize ; ++k)
if(m[i][j] && m[j][k] && !m[i][k])
tarayaee = false;
}
}
return baztab & tagharony & tarayaee;
}
اما در مورد RF.Ariyapoor (http://barnamenevis.org/forum/member.php?u=68924) عزیز باید بگم که اون قدر ها هم بی صوات نبودم! منظورم این بود که این ماتریس خلوت را چگونه ذخیره کرده اید(لینک لیست یا ...)؟ چگونه ضرب انجام دادید؟ و ...
در مورد کد ماتریس خودمان هم قرار است دوستم این کد را در سایت قرار دهد ولی گفته باشم که هنوز ردیابی آن تمام نشده است و ممکن است خطا هایی داشته باشد.
یا علی
خدانگهدارتان

aminwxy
شنبه 26 مرداد 1387, 17:43 عصر
با تشکر از شما که این برنامه رو نوشتین:تشویق:

esshahab
یک شنبه 27 مرداد 1387, 06:48 صبح
با سلام
این هم از کدهای ماتریس
بخونید و نظرتون را در مورد همکاری اعلام کنید

Salar Ashgi
سه شنبه 29 مرداد 1387, 14:24 عصر
سلام ، اینم کد مورد نظر شما برای هر ماتریس n*n :


#include <iostream>
#include <conio>
int main(){
int n;
bool r1,r2,r3;
cout<<"Enter Size of Matrix\n";
cin>>n;
//--------------
int **a=new int*[n];
for(int i=0;i<n;i++)
a[i]=new int[n];
//--------------
cout<<"Enter Your Matrix\n";
for(int i=0;i<n;i++){
for(int j=0;j<n;j++)
cin>>a[i][j];
}
cout<<"___________________________________\n\n";
//--------------
//Baztabi
int f1=0;
for(int i=0;i<n;i++){
if(a[i][i]==1)
f1++;
}
if(f1==n){
cout<<"Baztabi Ast\n\n";
cout<<"-----------------\n";
r1=true;
}
else{
cout<<"Baztabi Nist\n\n";
cout<<"-----------------\n";
r1=false;
}
//--------------
//Tagharoni
int f2=0;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(i<j){
if(a[i][j]==a[j][i])
f2++;
}
}
}
if(f2==(((n*n)-n)/2)) {
cout<<"Tagharoni Ast\n\n";
cout<<"-----------------\n";
r2=true;
}
else{
cout<<"Tagharoni Nist\n\n";
cout<<"-----------------\n";
r2=false;
}
//--------------
//Ta-addi
int f3=0;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
for(int k=0;k<n;k++){
if((a[i][j]==1 && a[j][k]==1))
{
if(a[i][k]!=1){
f3++;
break;
}
}
}}}
if(f3==0) {
cout<<"Taaddi Ast\n\n";
r3=true;
}
else{
cout<<"Taaddi Nist\n\n";
r3=false;
}
//--------------
cout<<"________________________________\n\n";
if(r1==true && r2==true && r3==true){
cout<<"Hamarzi Ast\n\n";
cout<<"-----------------\n";}
else{
cout<<"Hamarzi Nist\n\n";
cout<<"-----------------\n";
}
getch();
}
موفق و پیروز باشید !!!:لبخندساده:

YourWorldToday
پنج شنبه 04 تیر 1388, 20:35 عصر
با سلام خدمت دوستان گرامی
این قسمت متقارن برنامه درست کار می کنه؟


//Tagharoni
int f2=0;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(i<j){
if(a[i][j]==a[j][i])
f2++;
}
}
}
if(f2==(((n*n)-n)/2)) {
cout<<"Tagharoni Ast\n\n";
cout<<"-----------------\n";
r2=true;