عملیات روی آرایه ها در متلب
بهنام خدا، سلام… به هشتمین جلسه آموزش متلب رایگان هوسم رسیدیم. در جلسه پنجم آموزش رایگان متلب، نحوه تعریف آرایه درمتلب را بررسی کردیم. در این جلسه میخواهیم با نحوه انجام عملیات روی آرایه ها در متلب مانند جمع، تفریق، ضرب، تقسیم و توان آشنا شویم. با هوسم همراه باشید…
مقدمهای بر عملیات روی آرایه ها در متلب
در جلسه آشنایی با محیط متلب گفتیم که از متلب میتوانیم بهعنوان ماشینحساب استفاده کنیم. وقتی کلمه ماشین حساب را خواندید، چه نوع ماشین حسابی به ذهنتان رسید؟ ماشین حسابهای سادهای که مغازهدارها دارند یا ماشینحسابهای مهندسی با یک عالمه دکمه؟ باید بگوییم که متلب یک ماشین حساب مهندسی پیچیده با دریایی از امکانات مختلف است. در این جلسه ما میخواهیم گوشهای از این امکانات را به شما نشان دهیم.
جمع و تفریق دو ماتریس در متلب
شاید عنوان سادهترین عملیات ریاضی را بتوان به جمع و تفریق نسبت داد. قبلا دیدید که در متلب به سادگی میتوان دو عدد را با هم جمع یا از هم کم کرد. ببینید:
>> 8 - 2
ans = 6
>> 4 + 5
ans = 9
به همین ترتیب میتوان آرایهها را با هم جمع یا تفریق کرد. از ریاضیات میدانیم که برای جمع یا تفریق، آرایهها باید ابعاد یکسانی داشته باشند. دقت کنید که این نکته ساده ولی مهم را همیشه رعایت کنید. دو بردار به نامهای a1 و a2 تعریف کنید. بردارها را با هر ابعادی دوست دارید بسازید. ما طول بردار را 5 در نظر گرفتیم. سپس این بردارها را یک بار با هم جمع و یک بار از هم تفریق کنید:
>> a1 = randi(10, 1, 5)
a1 = 9 10 2 10 7
>> a2 = randi(10, 1, 5)
a2 = 1 3 6 10 10
>> a1 + a2
ans = 10 13 8 20 17
>> a1 - a2
ans = 8 7 -4 0 -3
خب به راحتی توانستیم دو بردار هماندازه را جمع و تفریق کنیم. ماتریسها را هم به همین ترتیب میتوان جمع و تفریق کرد. بیایید دو ماتریس به نامهای b1 و b2 به ابعاد 2 در 3 تعریف کنیم. سپس آنها را جمع و تفریق کنیم:
>> b1 = randi(10, 2, 3)
b1 = 2 10 9 10 5 2
>> b2 = randi(10, 2, 3)
b2 = 5 8 7 10 10 1
>> b1 - b2
ans = -3 2 2 0 -5 1
>> b1 + b2
ans = 7 18 16 20 15 3
حالا اگر ابعاد دو ماتریس برابر نباشند چه اتفاقی میافتد؟ مثلا بیایید بردار a1 را با ماتریس b1 جمع کنیم:
>> a1 + b1
Matrix dimensions must agree.
میبینید که متلب خطا داده است. این خطا میگوید: Matrix dimensions must agree. یعنی ابعاد ماتریسها باید برابر باشند. پس اگر با چنین خطایی مواجه شدید بدانید که ماتریسهایتان هماندازه نیستند. خب کاملا واضح هست. جمع و تفریق، به صورت درایه به درایه در آرایهها (ماتریس یا بردار) انجام میشود.
>> a = randi(100, 10, 10); >> b = randi(100, 10, 10); >> a + b
>> a - b
خطا در متلب
اولین باری است که در طول این جلسات، خطا یا error در متلب را به شما نشان دادهایم. دیدید که وقتی خطا را به فارسی ترجمه میکنیم، به راحتی معنیدار است. بسیار بسیار بسیار زیاد دیدهایم که دانشجویان با دیدن کوچکترین خطایی دست از کار میکشند. یا تلگرام را باز کرده و در تمامی گروههایی که عضو هستند اسکرینشاتی از خطا را میفرستند. یا از آن بدتر، اسکرینشات هم نمیفرستند و فقط در گروه اعلام میکنند که یک متخصص متلب بیاید کمک! 😁 عزیزان، باور کنید خطایابی کار سختی نیست. خطا را بخوانید و بعد ترجمه کنید. اگر متوجه نشدید، دقیقا همان خطا را در گوگل سرچ کنید. یعنی، خطای قرمز رنگ بالا را در گوگل کپی کنید. سایتی مانند stackoverflow معمولا به بالای 90 درصد این سوالها پاسخ داده است.
جمع ماتریس با اسکالر در متلب
در این بخش میخواهیم نحوه جمع یک ماتریس با اسکالر در متلب را آموزش دهیم. ماتریسها و بردارها را میتوان با یک اسکالر (یک عدد) جمع یا تفریق کرد. خب شاید بگویید ماتریس و بردار که ابعادشان با یک اسکالر برابر نیست و این جمع یا تفریق بیمعنی است. ولی در عمل این چنین نیست. اگر در متلب یک ماتریس یا بردار را با یک اسکالر جمع کنیم، آن اسکالر با تمام درایهها جمع خواهد شد. برای تفریق هم همینطور است. آن اسکالر از تمام درایهها کم خواهد شد. حالا برای اینکه موضوع برایتان روشنشود، عدد 4 را به a1 اضافه کنید و عدد 1 را از b2 کم کنید:
>> a1
a1 =
9 10 2 10 7
>> a1 + 4
ans = 13 14 6 14 11
>> b2 = 5 8 7 10 10 1 >> b2 - 1
ans = 4 7 6 9 9 0
مشاهده میکنید که 4 واحد به تمام درایههای a1 اضافه شد. همچنین یک واحد از تمام درایههای b2 کم شده است.
>> a + 5 >> b - 4
ضرب در متلب
در این بخش از «عملیات روی آرایه ها در متلب»، میخواهیم ضرب در متلب را آموزش دهیم. ضرب اعداد در متلب نیز به راحتی با عملگر * قابل انجام است. به عنوان مثال برای ضرب دو عدد کافی است بنویسیم:
>> 4 * 6
ans = 24
ضرب بردارها و ماتریسها اما نکته دارد. برای ضرب ماتریسها و بردارها سه حالت وجود دارد: ضرب ماتریسی، ضرب درایهبهدرایه و ضرب اسکالر در ماتریس یا بردار. در ادامه هرکدام از این حالات را بررسی خواهیم کرد.
ضرب دو ماتریس در متلب
ضرب دو ماتریس در تصویر بالا نشان داده شده است. در ریاضیات ما نمیتوانیم هر دو بردار یا ماتریسی که دلمان بخواهد را در هم ضرب کنیم. بردارها یا ماتریسهایی را میتوانیم در هم ضرب کنیم که ابعادشان با هم سازگار باشند. یعنی چه؟ به کلمه سازگار دقت کنید. نگفتیم ابعاد برابر باشد، گفتیم سازگار باشد… یعنی تعداد ستون ماتریس اول با تعداد سطر ماتریس دوم برابر باشد. یعنی اگر ابعاد ماتریس اول m×n باشد، ابعاد ماتریس دوم حتما باید n×k باشد. به بیان دیگر، تعداد ستونهای ماتریس اول باید با تعداد سطرهای ماتریس دوم برابر باشد.
ماتریس b1 که قبلا تعریف کردیم ابعادش 3×2 بود. میخواهیم ماتریس جدیدی تعریف کنیم و در b1 ضرب کنیم. طبق قانونی که گفتیم، ماتریس جدید چند سطر باید داشته باشد؟ بله 3 سطر باید داشته باشد. تعداد ستونها را مثلا 4 در نظر میگیریم. اسم ماتریس جدید را c سپس c را در b1 به کمک * ضرب میکنیم:
>> c = randi(10, 3, 4)
c = 9 8 7 1 10 8 2 3 7 4 8 1
>> b1 * c
ans = 181 132 106 41 154 128 96 27
مشاهده میکنید که دو ماتریس در هم ضرب شدند. شاید بخواهید از قانونی که در ضرب ماتریسها گفتیم مطمئن شوید. فکر میکنید اگر b1 را در b2 ضرب میکردیم چه میشد؟ ابعاد هردو 3×2 است. بیایید امتحان کنیم:
Error using * Incorrect dimensions for matrix multiplication. Check that the number of columns in the first matrix matches the number of rows in the second matrix. To perform elementwise multiplication, use '.*'.
متلب میگوید که چک کنید که تعداد ستونها در ماتریس اول با تعداد سطرها در ماتریس دوم برابر باشد. اگر شما با ضرب ماتریسها در ریاضیات آشنا باشید، قانون ضرب ماتریسها برایتان بدیهی خواهد بود. اما اگر با ضرب ماتریسها آشنایی ندارید، از شما میخواهم هرچه سریعتر یاد بگیرید! چون در کدنویسی دانستن تئوری هم مهم و ضروری است.
ضرب بردارها در متلب
در ضرب بردارها هم همین قانون برقرار است. یک بردار ستونی به طول m (یعنی به ابعاد m در 1) میتواند در یک بردار سطری به طول k (یعنی به ابعاد 1 در k) ضرب شود. یک بردار سطری به طول n (یعنی به ابعاد 1 در n) میتواند در یک بردار ستونی به طول n (یعنی به ابعاد n در 1) یا یک ماتریس به ابعاد n در k ضرب شود.
a * b
ضرب درایه به درایه در متلب
ضرب درایه به درایه یا elementwise به این معنی است که آرایهها درایه به درایه در هم ضرب میشوند. دقیقا مثل همان جمع و تفریقی که گفتیم… تصویر زیر نمونهای از این نوع ضرب را نشان میدهد:
در ضرب درایه به درایه در متلب، درایهها نظیر به نظیر در هم ضرب میشوند. واضح است که در این نوع ضرب، ابعاد آرایهها باید با هم برابر باشند. در ریاضیات شاید این نوع ضرب ماتریسی مهم نباشد. اما در کار با دادهها زیاد پیش میآید که به این نوع ضرب نیاز پیدا کنیم. ضرب دادهها به صورت درایه به درایه در متلب با عملگر *. قابل انجام است. دقت کنید که کنار علامت * یک نقطه وجود دارد. به طور کلی وقتی نقطه کنار یک عملگر قرار میدهیم منظورمان عملیات درایه به درایه است. خب برای مثال b1 و b2 را در هم درایه به درایه ضرب کنید:
>> b1 .* b2
ans = 10 80 63 100 50 2
مشاهده میکنید با استفاده از علامت *. به جای * نه تنها خطا نداد، بلکه این دو ماتریس به صورت درایهبهدرایه در هم ضرب شدند. مشاهده میکنید ابعاد ماتریس خروجی با ماتریس ورودی برابر است.
a * b
ضرب اسکالر در آرایه در متلب
همانند جمع و تفریق، شما میتوانید تمام عناصر یک آرایه را در یک اسکالر ضرب کنید. به عنوان مثال:
>> a1 * 3
ans = 27 30 6 30 21
>> b1 * 2
ans = 4 20 18 20 10 4
خب انصافا بعد از چند جلسه سخت، جلسه عملیات روی آرایه ها در متلب ساده و راحت هست…
a * 0.2
تقسیم در متلب
تقسیم اعداد در متلب با عملگر / قابل انجام است. مثلا:
>> 7 / 3
ans = 2.3333
همانند ضرب، برای تقسیم ماتریسها و بردارها سه حالت وجود دارد: تقسیم ماتریسی، تقسیم درایهبهدرایه و تقسیم اسکالر در ماتریس یا بردار. در ادامه هرکدام از این حالات را بررسی خواهیم کرد.
تقسیم ماتریسی
تقسیم برای ماتریس ها و بردارها در ریاضیات تعریف نشده است. ما چیزی به نام تقسیم ماتریس بر ماتریس نداریم. خب اگر در متلب بنویسیم مثلا b1/b2 چه میشود؟ با خطا مواجه میشویم؟ ببینیم:
>> b1 / b2
ans = 1.4584 -0.3522 0.0089 0.7501
خب حالا این سوال مطرح میشود که اگر تقسیم دو ماتریس وجود ندارد، پس این چیست؟! در ریاضی برای حل معادله 3x = 6 ما سریع 6 را بر 3 تقسیم میکنیم و x میشود 2! اما بهدستآوردن x در معادله ماتریسی Ax = C آنقدرها هم ساده نیست. در این معادله نمیتوانیم C را بر A تقسیم کنیم. چون اصلا تقسیم دو ماتریس تعریفی برایش وجود ندارد! خب پس چطور این معادله حل میشود؟ این معادله به شکل زیر حل میشود:
XA = C
XAA–1 = CA–1
XI = CA–1
X = CA–1
X = C / A
در متلب هم دقیقا همین نتیجه برگردانده میشود. یعنی عبارت ریاضی CA–1 معادل همان C / A در متلب هست. جالب بود نه؟
AX = C
A–1AX = A–1C
IX = A–1C
X = A–1C = A / C
تقسیم درایه به درایه
درست مانند ضرب، در تقسیم درایه به درایه، درایههای دو ماتریس یا بردار نظیر به نظیر بر هم تقسیم میشوند. در متلب برای انجام تقسیم درایه به درایه از عملگر /. استفاده میشود. دقت کنید که در تقسیم درایه به درایه ابعاد دو ماتریس باید برابر باشد. برای مثال فرض کنید بخواهیم دو ماتریس b1 و b2 را درایه به درایه بر هم تقسیم کنیم:
>> b1 ./ b2
ans = 0.4000 1.2500 1.2857 1.0000 0.5000 2.0000
دقت کنید که در اینجا نیز ابعاد خروجی دقیقا برابر با ماتریسهای ورودی است.
>> a ./ b
تقسیم آرایه بر اسکالر
در متلب با عملگر / میتوان یک ماتریس یا بردار را بر یک اسکالر تقسیم کرد. مثلا فرض کنید بخواهیم بردار a1 را بر 6 تقسیم کنیم. خواهیم داشت:
>> a1 / 6
ans =
1.5000 1.6667 0.3333 1.6667 1.1667
واضح است دیگر؟ تمامی درایههای a1 بر عدد 6 تقسیم شدهاند.
>> b / 2
به توان رساندن ماتریس در متلب
برای به توان رساندن یک عدد در متلب از علامت ^ استفاده میشود. برای مثال:
>> 2 ^ 5
ans = 32
اما به توان رساندن ماتریس در متلب یعنی چه؟ یعنی چه یک ماتریس را به توان مثلا 2 برسانیم؟ در متلب یک ماتریس به توان 2 یعنی اینکه ماتریس را در خودش ضرب کنیم. توانهای بالاتر چه؟ مثلا یک ماتریس به توان 4 یعنی چه؟ در متلب یعنی یک ماتریس را 4 بار در خودش ضرب کنیم. حالا مثلا بیایید b1 را به توان 3 برسانیم:
>> b1 ^ 3
Error using ^ (line 51) Incorrect dimensions for raising a matrix to a power. Check that the matrix is square and the power is a scalar. To perform elementwise matrix powers, use '.^'.
با خطا مواجه شدیم! این خطا میگوید ابعاد ماتریسها با هم نمیخواند. ما یک نکته مهم را فراموش کردیم. مگر قرار نبود اگر دوماتریس را در هم ضرب میکنیم، ستونهای اولی با سطرهای دومی برابر باشد؟ خب ماتریس b1 ما 2 در 3 بود. این که نمیتواند در خودش ضرب شود. بنابراین فقط ماتریسهایی را میتوانیم در متلب به توان برسانیم که تعداد سطرها و ستونهایشان برابر باشد. یعنی یک ماتریس مربعی باشد. پس شرط استفاده از عملگر ^ این است که ماتریس ما مربعی باشد. واضح است که ما بردارها را نیز نمیتوانیم به توان برسانیم.
همانند ضرب و تقسیم، عملگر ^. درایه به درایه به توان میرساند. مثلا اگر بخواهیم همان b1 را درایه به درایه به توان 3 برسانیم باید بنویسیم:
>> b1 .^ 3
ans = 8 1000 729 1000 125 8
مشاهده میکنید که هرکدام از درایههای b1 به توان 3 رسیده است.
>> a ^ 3
به توان رساندن هر درایه از ماتریس در متلب
در بخش قبلی یاد گرفتیم که به توان رساندن یک ماتریس در متلب یعنی اینکه آن ماتریس را به تعداد دفعات مشخص در خودش ضرب کنیم. در این بخش میخواهیم نحوه به توان رساندن هر درایه از ماتریس را آموزش دهیم. حدس میرنید چگونه این کار انجام میشود؟
در بخشهای قبلی گفتیم که علامت نقطه کنار هر عملگری بیاید باعث میشود که آن عمل به صورت درایه به درایه انجام شود. در بخشهای قبل هم دیدیم که مثلا دیدیم که *. به معنی ضرب درایه به درایه است. به شکل مشابه، برای به توان رساندن هرکدام از درایههای ماتریس، کافی است که از علامت ^. استفاده کنید. مثلا برای اینکه هر درایه از c را به توان 2 برسانید، کافی است بنویسید:
>> c .^ 2
ans =
81 64 49 1
100 64 4 9
49 16 64 1
مشاهده میکنید که هر درایه از ماتریس c به توان 2 رسیده است.
>> a .^ 3
دریافت PDF جلسه عملیات روی آرایه ها در متلب
برای دریافت pdf این جلسه، لطفا ایمیل خود را در باکس زیر وارد کرده و روی دکمه «دریافت pdf» کلیک کنید.
منابع آموزش متلب
در فهرست زیر، تعدادی از منابع خوب آموزش متلب را معرفی کردهایم. ضرورتی وجود ندارد که اینها را نگاه کنید. چون ما برای آموزش متلب، این منابع را مطالعه و استفاده کردهایم.
بسیار خب، جلسه هشتم هم با موضوع عملیات روی آرایه ها در متلب به پایان رسید. این جلسه ساده بود و شاید تنها بخش تقسیم کمی سخت باشد. درهرصورت میتوانید سوالات یا مشکلات خود را کامنت کنید تا به شما کمک کنیم. جلسات آموزش متلب رایگان هوسم را دنبال کنید و لطفا به دوستان خود هم معرفی کنید. ما هم دلگرم میشویم و دورههای رایگان بیشتری آماده خواهیم کرد. با هوسم همراه باشید…
مطالب زیر را حتما مطالعه کنید
تعریف متغیر در متلب
آموزش متلب رایگان
دستور max در متلب
دستور محاسبه انتگرال در متلب
دستور input در متلب
دستور ezplot در متلب
8 دیدگاه
به گفتگوی ما بپیوندید و دیدگاه خود را با ما در میان بگذارید.
بسیار عالی تشکر
باسلام
کدی که در بخش پاسخ تمرین ۵ آپلود کردید اشتباهه باید a.*b باشه ولی شما a*b رو بارگذاری کردید.
واقعا حوصله و وقت ديدن كليپ هاي اموزشي متلب نداشتم، با اين مطالب دسته بندي شده ، كارم راحت كردين. ممنونم
سلام
ممنون. خوشحالیم که آموزش براتون مفید بوده. 🌹🙏
خدا قوت
سپاس 🌹🙏
سلام
خدا قوت
اون بخش «تقسیم ماتریسی» رو کاش مثل ضرب شکلش رو میکشیدید تا بهتر متوجه بشیم چی شده. 🙂
سلام
پیشنهاد خوبیه، ممنون 🙏
انشالله شکلش رو اضافه میکنیم.