ذخیره ماتریس در حلقه for متلب
نویسنده : محمد پارسایی | زمان انتشار : 25 اسفند 1400 ساعت 01:04
جهت انجام پروژه های دانشجویی و یا تمرینهای برنامه نویسی رشته کامپیوتر میتوانید به آی دی تلگرام زیر پیام دهید
@AlirezaSepand
در آموزش رایگان متلب ، نحوه تعریف یک ماتریس را بررسی کردیم. هدف ما در این پست، ایجاد ماتریس با حلقه for در متلب است. یعنی میخواهیم یک ماتریس تعریف کنیم که تک تک آرایههای آن بر اساس معادله خاصی که خودمان تعیین کردیم پر شده است! پس تا پایان این پست هیجانانگیز همراهمان باشید…
مقدمه
قبلا ما چند روش برای تعریف ماتریسها در متلب معرفی کردیم. گفتیم که چگونه با کمک براکت یک بردار یا ماتریس تعریف کنید. بعد هم چندین دستور معرفی کردیم که ماتریسهای خاص مانند ماتریس صفر و غیره را تولید میکردند. اما حالا هدف ما ایجاد ماتریس با حلقه for در متلب است! اگرچه با این روش تنها ماتریسهای خاصی را میتوان تعریف کرد. اما این روش هم گاهی بسیار به درد میخورد! در بخش بعدی از پست «ایجاد ماتریس با حلقه for در متلب» میرویم که یاد بگیریم چطور با حلقههای تودرتو در متلب، یک ماتریس بسازیم.
ساختن ماتریس صفر با for
فکر میکنم همگی شما با ماتریس صفر آشنا باشید. به ماتریسی که تمام درایههای آن صفر باشد، ماتریس صفر میگویند! اگرچه این ماتریس را به راحتی با دستور zeros میتوان ساخت، ولی ما میخواهیم این ماتریس را این بار با for بسازیم.
ما میخواهیم یک ماتریس صفر به ابعاد 3 * 5 بسازیم. یعنی این ماتریس 5 سطر و 5 ستون دارد و تمامی درایههای آن صفر هستند. برای این کار به دو for توردرتو احتیاج داریم. یکی از این for-ها شماره سطر و دیگری شماره ستون را نشان میدهد.
clear clc for i = 1 : 5 for j = 1 : 3 zero_matrix(i, j) = 0; end end disp(zero_matrix)
- خط 1 و 2: اینها که واضح هستند. تمام متغیرها را حذف کرده و command window را پاک میکنیم!
- خط 4: یک حلقه for تعریف کردیم. ایندکسِ این حلقه، شماره سطرها است. بنابراین چون 5 تا سطر داشتیم، i را از 1 تا 5 در نظر گرفتیم.
- خط 5: یک حلقه for جدید تعریف کردیم. ایندکسِ این حلقه اما شماره ستونها را نشان میدهد. بنابراین j را از 1 تا 3 در نظر گرفتیم.
- خط 6: ماتریسی که میخواهیم بسازیم را در متغیری به نام zero_matrix ذخیره میکنیم. در هر تکرار از حلقه دوم، یک سطر از ماتریس پُر میشود. دقت کنید که حتما باید به وسیله i و j ماتریس zero_matrix را اندیسدهی کنید.
- خط 9: در نهایت ماتریس zero_matrix را نمایش میدهیم!
با اجرای کدی که نوشتیم، خروجی زیر را خواهیم داشت:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
مشاهده میکنید که نتیجه یک ماتریس صفر با 5 سطر و 3 ستون است. همان که میخواستیم! در بخش بعدی از پست «ایجاد ماتریس با حلقه for در متلب» یک مثال پیچیدهتر را بررسی خواهیم کرد…
ساخت یک ماتریس پیچیدهتر!
ساختن ماتریس صفر بسیار ساده بود. حالا میخواهیم ماتریسی به شکل زیر بسازیم:
اول از همه بگویید ببینم ابعاد ماتریسی چه هست؟ ماتریس موردنظرمان یک ماتریس 6 * 6 است. خب بگویید ببینم چطور میتوانیم با for چنین ماتریسی بسازیم؟ تمامی اعداد در یک سطر با هم برابر هستند درست است؟ و مقدارش هم دقیقا برابر با شماره سطر است. یعنی در سطر اول، همه اعداد یک هستند، در سطر دوم همه 2 هستند و الی آخر.
کدهای ایجاد ماتریس با حلقه for در متلب
پس باید کدمان را به شکل زیر تغییر دهیم:
clc clear for i = 1 : 6 for j = 1 : 6 my_matrix(i, j) = i; end end disp(my_matrix)
- خط 4 و 5: اندیسها را متناسب را با ابعاد ماتریسمان تغییر میدهیم. ماتریس ما 6 در 6 است. بنابراین i و j را 1 تا 6 در نظر میگیریم.
- خط 6 : مقدار همه ستونها در یک سطر باید برابر با اندیسِ همان سطر باشد. یعنی اگر در سطرِ 5 باشیم، مقدار همه ستونها باید برابر با 5 باشند! از این رو مقدار my_matrix(i, j) ، یعنی درایهای که در سطر i و ستون j است را برابر با i قرار میدهیم.
- خط 7: در نهایت هم ماتریسی که ساختیم را نمایش میدهیم.
کدی که نوشتیم را اجرا میکنیم. ببینیم چه کردیم!:
1 1 1 1 1 1 2 2 2 2 2 2 3 3 3 3 3 3 4 4 4 4 4 4 5 5 5 5 5 5 6 6 6 6 6 6
مشاهده میکنید که به هدفمان رسیدیم. ماتریسی که ساختیم دقیقا همان ماتریس هدفمان است! برویم سراغ بخش بعدی از پست « ایجاد ماتریس با حلقه for در متلب»…
ساخت ماتریس صفر و یک با for
در این بخش یک ماتریس پیچیدهتر از ما خواسته شده است. باید یک ماتریس صفر و یک بسازیم به شکل زیر:
اول از همه باید رابطه میان اعداد و اندیسها پیدا کنیم! درایهها یک در میان صفر و یک هستند. چون صحبت از یکی در میان شد، ممکن است بتوان این را به زوج و فرد بودن ربط داد. کمی بیشتر دقت کنید. در سطرهایی با اندیسِ فرد، مقدار درایههای ستونهای زوج، یک هستند! در سطرهای با اندیس فرد، این مسئله برعکس است. یعنی اگر اندیس سطر، زوج باشد، مقدار ستونهای با اندیس فرد، یک خواهد بود.
مسئله ما همان XOR است!
پس ما با یک مسئله شرطی مواجه هستیم. داخل حلقهها باید یک شرط بنویسیم که اگر اندیسِ سطر زوج بود فلان کار را بکن و در غیر اینصورت بسار کار را! تا اینجا درست؟ اما بیایید تکلیف عبارت شرطی را هم مشخص کنیم. با کمی دقت به نتیجه زیر خواهیم رسید:
- اگر اندیسِ سطر و ستون، هردو زوج یا هردو فرد باشند، مقدار درایه متناظرشان 0 است.
- اگر اندیسِ سطر، زوج و اندیسِ ستون فرد یا برعکس باشد، مقدار درایه متناظرشان 1 است.
در واقع ما میخواهیم عملیات XOR را انجام دهیم درست است؟ اگر زوج بودن را 1 و فرد بودن را 0 در نظر بگیریم:
کدهای ماتریس صفر و یک
مشاهده کردید که مسئله دقیقا XOR است. با علم به این موضوع کد زیر را مینویسیم:
clc clear for i = 1 : 6 for j = 1 : 6 if xor(rem(i, 2) == 0, rem(j, 2) == 0) my_matrix(i, j) = 1; else my_matrix(i, j) = 0; end end end disp(my_matrix)
- خط 1 تا 5: این خطوط دیگر نیاز به توضیح ندارند!
- خط 6 تا 9: در این خط، یک عبارت شرطی نوشتیم! عبارت rem(i, 2) == 0 چیست؟ دستور rem در متلب برای محاسبه باقیمانده استفاده میشود. اگر باقیمانده تقسیم i بر 2 صفر باشد یعنی چه؟ یعنی i بر 2 بخشپذیر است و طبیعتا i زوج است. نتیجه عبارت rem(i, 2) == 0 یا صفر است یا یک. اگر i زوج باشد نتیجهاش یک و در غیر اینصورت صفر خواهد بود. برای عبارت rem(j, 2) == 0 نیز همین توضیحات صادق است. بنابراین اگر xor این دو عبارت 0 باشد، درایه متناظر با j و j باید صفر باشد. در غیر اینصورت آن درایه باید یک باشد.
- خط 13: در نهایت هم نتیجه را نمایش میدهیم.
نتیجه کدی که نوشتیم به شکل زیر خواهد بود:
0 1 0 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 1 0 1 0 1 0
نتیجه دقیقا همان چیزی است که میخواستیم 😉.
جمعبندی
عنوان این پست «ایجاد ماتریس با حلقه for در متلب» بود! ما در این پست با استفاده از حلقههای تو در تو توانستیم یک ماتریس بسازیم. سه مثال ساده، متوسط و پیچیده را بررسی کردیم. شما چه ماتریسهایی را با حلقهها تودرتو ساختید؟ برایمان کامنت کنید😊. امیدوارم این آموزش مورد توجه شما قرار گرفته باشد.
منبع: howsam.org