برنامه‌نویسی؟ ساده است! (3)

جمع و ضرب دو ماتریس

این هفته قصد داریم، قطعه برنامه‌ای برای ضرب و جمع دو ماتریس بنویسیم. بسیار خب، اول کمی این مساله را از نظر ریاضی بررسی می‌کنیم. برای اینکه دو ماتریس بتوانند با هم جمع شوند، باید سطر و ستون یکسانی داشته ‌باشند. برای ضرب نیز باید تعداد سطرهای ماتریس اول برابر تعداد ستون‌های ماتریس دوم باشد یا برعکس. خب، حال این مساله ریاضی را با یکی از زبان‌های برنامه‌نویسی بررسی می‌کنیم:
کد خبر: ۳۱۳۷۱۵

ماتریس دارای دو بعد است، بعد اول را سطر و بعد دوم را ستون می‌نامند.

پس برای پیاده‌سازی یک ماتریس در کامپیوتر نیاز به یک آرایه دو بعدی داریم (این نکته را نیز باید ذکر کرد که الزاما نیازی به آرایه دو بعدی نیست و می‌شود بدون آرایه دو بعدی نیز ماتریس را پیاده کرد ولی استفاده از آرایه دو بعدی ساده‌ترین روش است). حال فرض می‌کنیم داده‌های ماتریس ما همگی اعداد صحیح هستند، پس تعریف ماتریس به‌صورت زیر خواهد بود:

#define COL 3

#define ROW 4

int matrix1[ROW,COL];

int matrix2[ROW,COL];

مقدار COL و ROW تعداد سطرها و ستون‌های یک ماتریس را مشخص می‌کنند. همان‌طور که گفته شد برای اینکه بتوان دو ماتریس را در هم ضرب کرد، باید ROW با COL برابر باشد، سپس درایه‌های ماتریس اولی را نظیر‌به‌نظیر با درایه‌های ماتریس دوم جمع می‌کنیم. این‌کار را با دو حلقه می‌توان به سادگی انجام داد:

for(int row=0; row«ROW; row++)

for(int col=0; col«COL ; col++)

matrix1[row][col]+=matrix2[row][col];

بسیار خب، حال به‌سادگی می‌توانید دو ماتریس را باهم جمع کنید. محاسبه ضرب دو ماتریس یک مقدار نسبت به جمع دو ماتریس سخت‌تر است، فقط در هنگام ضرب دو ماتریس شرطی رابطه بین ستون‌ها و سطرهای دو ماتریس باید لحاظ شود. برای اینکه برای ضرب نیز به دو آرایه دو بعدی نیاز است، پس ما کماکان باید از همان دو حلقه تودرتو که در بالا نوشتیم استفاده کنیم.

پیش از نوشتن کد به این سوال از طریق ریاضی پاسخ می‌دهیم: «دو ماتریس چگونه در هم ضرب می‌شوند؟»

وقتی دو ماتریس در هم ضرب می‌شوند، عناصر اولین سطر (ستون) ماتریس اول در عناصر اولین ستون (سطر) ماتریس دوم، نظیربه‌نظیر ضرب می‌شوند و حاصل‌جمع آنها در اولین عنصر از اولین سطر(ستون) قرار می‌گیرد.

به‌طور کلی اگر درایه‌های سطر(ستون) iم ماتریسی در درایه‌های ستون(سطر) ماتریسی نظیر‌به‌نظیر ضرب شوند، حاصل در عنصری از ماتریس حاصل قرار می‌گیرد که سطر(ستون) آن برابر i باشد و ستون(سطر) آن برابر j باشد. خوب حال این مطالبی که گفته شد را با یک زبان برنامه‌نویسی پیاده می‌کنیم:

for(int row=0; row«ROW; row++)

for(int col=0; col«COL; col++)

for(int temp=0; temp«ROW; temp++)

resMul[row][col]+=

matrix1[row][temp]*matrix2[temp][col];

بسیار خب، این قطعه برنامه دو ماتریس را در هم ضرب می‌کند. اگر شما از زبان‌های شیء‌گرا استفاده می‌کنید برخی از این زبان‌ها از operator overloading (بازنویسی عملگرها) پشتیبانی می‌کنند. به‌طور مثال #C و ++C از operator overloading (بازنویسی عملگرها) پشتیبانی می‌کنند و شما با استفاده از قوانین شیء‌گرایی می‌توانید اطلاعات یک ماتریس را در یک کلاس کپسوله‌سازی کنید و برای آن عملگرهای جمع و ضرب را بازنویسی کنید و به‌سادگی اشیا ساخته شده ازکلاس ماتریس را در هم جمع و ضرب کنید.

بطور مثال:

Matrix mx1(2,3);

mx1.Read();

Matrix mx2(3,4);

mx2.Read();

mx1 += mx2;

mx1.Print();

برای خواندن و نوشتن یک ماتریس روش‌های مختلفی هست که سلیقه‌ای است. در زیر یکی از این روش‌ها را به‌صورت کد می‌نویسیم:

for(int row=0; row«ROW; row++){

for(int col=0; col«COL; col++){

std::cout «« matrix1[row][col] «« «\t»; }

std::cout «« std::endl;

}

نوشتن کد مربوط به گرفتن ماتریس از ورودی، بر عهده خواننده قرار داده شده است.

امیربهاءالدین سبط‌الشیخ

newsQrCode
ارسال نظرات در انتظار بررسی: ۰ انتشار یافته: ۰

نیازمندی ها