تعریف تابع در متلب
در این جلسه تعریف تابع در متلب یا به عبارت دیگر تعریف function در متلب را بررسی خواهیم کرد. توابع در اکثر زبانهای برنامهنویسی وجود دارند. شما در جلسات قبل با توابع از پیش تعریف شده در متلب کار کردید. در انتهای این جلسه خواهید توانست که تابع مورد نظر خودتان را بنویسید و از آن استفاده کنید. با هوسم همراه باشید…
ویدئو نوشتن تابع در متلب (تئوری)
در جلسه هجدهم از آموزش رایگان متلب هوسم نحوه نوشتن تابع در متلب آموزش داده شده است. در این ویدئوی کوتاه،یک تعریف از تابع ارائه شده و همچنین سینتکس تابع در متلب بررسی شده است. این ویدئو بخشی از دوره متلب سوپراستارتر است.
چرا تابع؟
در ریاضی مفهومی به نام فاکتوریل وجود دارد که احتمالا همه شما با آن آشنایی دارید. به عنوان مثال !n یعنی تمامی اعداد کوچکترمساوی با n را در هم ضرب کنیم. یعنی n! = n × (n-1) × (n-2) × …. × 2 × 1. خب با استفاده از دستورهایی که تا الان یاد گرفتیم، چطور میتوانیم فاکتوریل را پیادهسازی کنیم؟ کاملا واضح است که در فاکتوریل، یک عمل تکراری یعنی ضرب کردن انجام میشود. این ضرب کردن هم نظم خاصی دارد. در هر بار ضرب، یک واحد از عدد قبلی کم میشود! مثلا کدی که برای محاسبه !5 میتوانیم بنویسیم به شکل زیر میتواند باشد:
f = 1; for num = 1 : 5 f = f * num; end
خب در کد بالا ما طول حلقه را از 1 تا 5 گذاشتیم. چرا؟ چون میخواهیم اعداد 1 تا 5 را در هم ضرب کنیم. آیا فرقی میکند 5 × 4 × 3 × 2 × 1 را محاسبه کنیم یا 1 × 2 × 3 × 4 × 5 را ؟ معلوم است که فرقی ندارد، چرا که ضرب خاصیت جابجایی دارد! ما یک متغیر به نام f بیرون حلقه تعریف کردیم و سپس آن را برابر با 1 قرار دادیم. چون عملیاتی که میخواهیم انجام دهیم ضرب است و عدد یک در ضرب خنثی است. سپس داخل حلقه در هر تکرار مقدار f را در مقدار num ضرب کرده و در متغیر f میریزیم. روند انجام محاسبات برای !5 را در تصویر زیر مشاهده میکنید.
خب حالا فرض کنید که بخواهیم !2 را در !4 ضرب کرده و سپس بر !3 تقسیم کنیم. برای این کار باید بنویسیم:
f4 = 1; for num = 1 : 4 f4 = f4 * num; end f2 = 1; for num = 1 : 2 f2 = f2 * num; end f3 = 1; for num = 1 : 3 f3 = f3 * num; end o = (f4 * f2) / f3;
به خاطر محاسبه o = (f4 * f2) / f3 این همه کد نوشتیم! اگر 5 تا از این محاسبات داشته باشیم احتمالا خودمان هم دیگر سر در نمیآوریم چی به چی هست نه؟ اصلا اسم متغیر کم میآوریم! اینجاست که اهمیت توابع مطرح میشوند. با تعریف یک تابع در متلب به نام fact کد بالا به سادگی میتواند به کد زیر تبدیل شود!
o = (fact(4) * fact(2) ) / fact(3);
خب به نظرتان کدامیک از کدهای بالا قابل فهمتر است؟ قطعا پاسخ شما پایینی است! اما لازمه این سبک کدنویسی، این است که تعریف تابع در متلب را یاد بگیریم. پس برویم سراغ بخش بعدی …
تعریف function در متلب
ساختار کلی تابع در متلب در شکل زیر نشان داده شده است. دو کلیدواژه در تعریف تابع وجود دارند، function و end. یک تابع با عبارت function شروع شده و با عبارت end پایان مییابد. البته برعکس for و if، اگر در functionعبارت end را نگذاریم، با خطا مواجه نمیشویم. اما بهتر است همیشه function را با end تمام کنیم.
برای تعریف یک تابع در متلب نیاز است تا چند مسئله را روشن کنیم:
1) نام تابع چیست؟ برای متلب مهم نیست شما چه اسمی انتخاب میکنید. متلب فقط میخواهد که قوانینی که برای نامگذاری دارد را رعایت کنید. با این قواعد در جلسه تعریف متغیر در متلب آشنا شدیم. تنها حروف کوچک و بزرگ انگلیسی، اعداد و علامت زیرخط (underline یا _) برای نامگذاری توابع مجاز هستند. اما دقت کنید که نام تابع نمیتواند با عدد شروع شود. رعایت این دو شرط برای انتخاب اسم برای تابع کافی است. اما قواعد نانوشتهای نیز برای انتخاب اسم وجود دارد. مهمترین مسئلهای که باید رعایت کنید انتخاب اسم معنی دار است. فرض کنید در تعریف فاکتوریل، اسم تابع را میگذاشتیم f مثلا! فکر میکنم اگر خودمان هم بعد یک ماه بخواهیم کدهایمان را مرور کنیم شاید یادمان نیاید f چه هست چه برسد به دیگران!
2) چند ورودی داریم و نام هر کدام چیست؟ ما باید تعیین کنیم تابع ما به چند ورودی نیاز دارد و سپس برای هرکدام اسم انتخاب کنیم. مثال فاکتوریل را در نظر بگیرید. واضح است که تابع به یک عدد به عنوان ورودی نیاز دارد. کافی است بداند چند فاکتوریل را میخواهیم تا آن را محاسبه کند. سپس برای هر کدام از ورودیها یک اسم انتخاب میکنیم. ورودیها در تصویر بالا (input1, input2, … , inputm) هستند.
3) چند خروجی داریم و نام هر کدام چیست؟ تعداد خروجیها نیز باید تعیین شوند. در مثال فاکتوریل، نتیجه یک عدد است بنابراین یک خروجی کافی است. سپس برای هرکدام از خروجیها یک اسم انتخاب میکنیم. خروجیها در تصویر بالا [out1, out2, …, outn] هستند. اگر یک خروجی داشته باشیم، میتوانیم براکت را برداریم. اما اگر بیش از یک خروجی داشته باشیم حتما باید براکت بگذاریم.
4) پس از مشخص کردن 3 مورد قبل، در قسمت <statements> کدهای مربوط به تابع را مینویسیم.
نکته تابع حتما باید در m-file نوشته شود!
تا اینجا دلیل نیاز به تابع و ساختار کلی یک تابع را یاد گرفتیم. این دانش اصلا کافی نیست! در بخشهای بعدی چند مثال از نحوه تعریف تابع آورده شده است. همچنین نکات بسیار بسیار مهمی وجود دارند که همراه با مثالها ارائه خواهد شد. پس لطفا به خواندنِ همین دو بخش اکتفا نکنید و بخشهای بعدی را هم با دقت مطالعه کنید. مثالها و تمرینها را حل کنید و سوالات خودتان را در کامنت بپرسید. برویم سراغ مثالها …
مثال 1: تبدیل دما از درجه سانتیگراد به کلوین
در این مثال میخواهیم تابعی بنویسیم که مقدار دما به درجه سانتیگراد را بگیرد و خروجی به ما مقدار دما به کلوین بدهد. خب باید آن 4 بندی که در بخش قبل گفتیم را تعیین کنیم. اولین کار این بود که یک اسم با معنی برای تابع انتخاب کنیم. اسم تابع را deg2kelvin میگذاریم. اگر صورت سوال را یک بار دیگر بخوانیم متوجه میشویم که تابع باید یک ورودی داشته باشد و یک خروجی. اسم ورودی را temp و اسم خروجی را هم kelvin انتخاب میکنیم. پس تا این جا در اولین خط از function باید عبارت function [kelvin] = deg2kel(temp) را بنویسیم.
خب نوبت نوشتن <statements> هست. در این بخش باید کدی بنویسیم که مقدار دما را به کلوین تبدیل کند. برای تبدیل دما از درجه سانتیگراد به کلوین، کافی است که دما به درجه را بعلاوه 273.15 کنیم:
[K] = [°C] + ۲۷۳٫۱۵
پس یک m-file باز کرده و کد زیر را در آن مینویسیم:
function kelvin = deg2kelvin(temp) kelvin = temp + 273.15; end
در این کد، متغیر temp که ورودی تابع است با 273.15 جمع شده است. مقدار حاصل به متغیر kelvin اختصاص داده شده است. دقت کنید که حتما باید متغیر ورودی و خروجی که در خط اول function تعریف کردیم، در بخش <statements> استفاده شوند. مثلا در کد بالا مقدار حاصل جمع اگر به متغیر دیگری مثل k اختصاص داده شود، تابع شما خروجی نخواهد شد! چرا که شما در خط اول گفتید مقدار متغیر kelvin را به عنوان خروجی قرار بده.
خب حالا چطور از این تابع استفاده کنیم؟ شما نمیتوانید در m-fileی که تابع را نوشتید، کد دیگری بنویسید. همچنین نمیتوانید با Run کردن تابع به نتیجه برسید! شما باید ابتدا تابعی که نوشتید را ذخیره کنید. حتما حتما هم نام فایلی که ذخیره میکنید باید با نام تابع یکسان باشد! سپس یک m-file جدید با نام test بسازید و آن را در پوشهای که تابع در آن وجود دارد ذخیره کنید. خب حالا میتوانید در test، تابعی که نوشتیم را استفاده کنید. برای این کار در test بنویسید:
deg2kelvin(20)
با اجرای این کد در Command Window خواهیم داشت:
>> test
ans = 293.1500
function [centigrade] = kelvin2deg(temp) centigrade = temp - 273.15; end
یادتان باشد که تابعها را در m-file نوشته و سپس با نام خودشان ذخیره کنید.
مثال 2: تبدیل دما از درجه سانتیگراد به کلوین و فارنهایت
در این مثال میخواهیم تابعی بنویسیم که درجه حرارت را به رجه سانتیگراد دریافت میکند. سپس این دما را به کلوین و فارنهایت تبدیل میکند. تفاوت اساسی این مثال با مثال قبلی، در تعداد خروجیهاست. اینجا ما دو خروجی داریم. اسمی که برای این تابع انتخاب temp_converter است. شما میتوانید نام دلخواه خودتان را انتخاب کنید. البته نامی که انتخاب میکنید باید معنادار باشد. رابطه بین درجه سانتیگراد و کلوین را در بخش قبل گفتیم. برای تبدیل درجه سانتیگراد به فارنهایت کافی است از فرمول زیر استفاده کنیم:
[°F] = [°C] × ۹⁄۵ + ۳۲
خب برای حل این مثال یک m-file جدید میسازیم. سپس کد زیر را مینویسیم:
function [kelvin, fahrenheit] = temp_converter(temp) kelvin = temp + 273.15; fahrenheit = temp * 1.8 + 32; end
قدم بعدی ذخیره کردن فایل است. m-file را با نام تابع یعنی temp_converter ذخیره میکنیم. سپس دوباره به test مراجعه کرده و سپس تابعی که تعریف کردیم را تست میکنیم:
[k, f] = temp_converter(30); disp(k) disp(f)
مشاهده میکنید که برای اینکه هردو خروجی تابع را داشته باشیم از دو متغیر k و f به صورت [k, f] استفاده کردیم. با Run کردن کد بالا خواهیم داشت:
>> 303.1500 >> 86
function [centigrade, fahrenheit] = temp_converter(temp) centigrade = temp - 273.15; fahrenheit = temp * 9 / 5 - 459.67; end
یادتان باشد که تابعها را در m-file نوشته و سپس با نام خودشان ذخیره کنید.
مثال 3: تابع فاکتوریل در متلب
دو مثال قبلی که حل کردیم کدنویسی پیچیدهای نداشت و فقط چهار عمل اصلی استفاده شد. در این بخش میخواهیم در بدنه تابع کد پیچیدهتری بنویسیم. در بخش اول ما مثالی در مورد فاکتوریل نوشتیم. گفتیم برای بهتر خوانده شدن کد آن را در یک تابع بنویسیم. در این بخش میخواهیم تابع فاکتوریل در متلب را پیادهسازی کنیم. اگر یادتان باشد اسم fact را انتخاب کرده بودیم. تابع فاکتوریل یک ورودی و یک خروجی خواهد داشت. خب در این صورت مثل همیشه در اولین قدم یک m-file میسازیم. سپس کد زیر را باید بنویسیم:
function out = fact(num) out = 1; for i = 1 : num out = out * i; end end
باز به test مراجعه میکنیم و در آن کد زیر را مینویسیم تا تابع fact را تست کنیم:
fact(3)
با اجرای کد بالا خواهیم داشت:
ans = 6
خب تبریک میگویم! شما توانستید تابع فاکتوریل را با موفقیت پیادهسازی کنید. شاید برایتان جالب باشد که متلب یک تابع از پیش تعریف شده با نام factorial دارد! این تابع فاکتوریل یک عدد را میدهد. یعنی شما توانستید یکی از توابع از پیش تعریف شده متلب را خودتان پیادهسازی کنید!
>> fact(8)
ans =
40320
>> factorial(8)
ans =
40320
>> fact(3)
ans =
6
>> factorial(3)
ans =
6
نکته متغیرهایی که داخل یک تابع وجود دارند، تنها داخل تابع معتبر هستند. یعنی اگر ما در تابع یک متغیر تعریف کنیم، در هنگام استفاده از تابع، اثری از آن متغیر در Workspace نخواهد بود! به تابع fact دقت کنید. آیا با اجرا کردن دستور fact(3)، اثری از متغیر i در workspace میبینید؟ یا حتی متغیرهای num و out؟ این متغیرها داخل دو عبارت function و end زندانی هستند! و اسمی از آنها در خارج از تابع وجود نخواهد داشت!
دریافت PDF جلسه تعریف تابع در متلب
برای دریافت pdf این جلسه، لطفا ایمیل خود را در باکس زیر وارد کرده و روی دکمه «دریافت pdf» کلیک کنید.
منابع آموزش متلب
در فهرست زیر، تعدادی از منابع خوب آموزش متلب را معرفی کردهایم. ضرورتی وجود ندارد که اینها را نگاه کنید. چون ما برای آموزش متلب، این منابع را مطالعه و استفاده کردهایم.
در این پست نحوه نوشتن تابع در متلب را بررسی کردیم. امیدوارم این آموزش مورد توجه شما قرار گرفته باشد. سوالات خود را پایین 👇 برایمان کامنت کنید. حتما سوالات شما پاسخ داده خواهد شد.
مطالب زیر را حتما مطالعه کنید
تعریف متغیر در متلب
آموزش متلب رایگان
دستور max در متلب
دستور محاسبه انتگرال در متلب
دستور input در متلب
دستور ezplot در متلب
19 دیدگاه
به گفتگوی ما بپیوندید و دیدگاه خود را با ما در میان بگذارید.
سلام سپاس از آموزش عالی و سایت خوبتون من خیلی استفاده کردم ممنونم واقعا خسته نباشید.
درود برشما
در این کد نویسی منظور ازخط دوم out = 1; چیست
function out = fact(num)
out = 1;
for i = 1 : num
out = out * i;
end
end
ما یک حلقه نوشتیم و مقدار i رو هر بار در out ضرب کردیم تا مقدار فاکتوریل به دست بیاد. اگر کد خط دوم نباشه، ما در خط 4 با خطا مواجه میشیم. چون در خط 4 عبارت out*i رو داریم در حالی که out قبلش تعریف نشده. بنابراین ناچاریم که out رو بیرون حلقه تعریف کنیم و یک مقداری بهش اختصاص بدیم. مقدار خنثی برای ضرب ، عدد یک هست. بنابراین out رو برابر با یک گذاشتیم.
با سلام
در مثال مربوط به فاکتوریل اشتباه داریم
برای فاکتوریل 2 و 3 دفعات تکرار حلقه باید 2و3 باشد نه 4 . برای هر سه حلقه 4 لحاظ شده
فکر کنم تیم خسته شده بدون تست کردن مثالها داره آموزش را پیش میبره . اینجور کار کردن نفرات مبتدی را گمراه میکنه .اصلاح تمرینها و مثالها هم که به کندی صورت میگیره نکنه تیم در حال استراحته .خخخخخ
سلام
اصلاح شد.
ممنون بابت گزارش خطا 🌹🙏
سلام ممنون بابت آموزش اتون
من اگر بخواهم رگرسیون بردار پشتیبان SVR با الگوریتم ازدحام ذرات PSO بهینه کنم
امکانش هست؟
با سلام
لطفا نحوه ذخیره mفایل تابع رو هم بفرمایید.
با تشکر
رو قسمت ران از بالای صفحه m file بزنی میتونی ذخیرش کنی
سلام
وقت تون بخیر
یه سوال داشتم :
فرض کنین یک تابع به نام obj نوشتیم، و در فایل اسکریپت ، خط کد زیر برای فراخوانی تابع نوشته شده:
f = @obj
این شکل فرخوانی در چه مواردی استفاده میشه؟ نماد @ کی استفاده میشه و سمت چپ تساوی چی قرار می گیرد؟
ممنون میشم توضیح بدین
با سلام و خسته نباشید
سوالی داشتم:
اگر تابع مورد نظر ما ورودی نداشته باشد به چه صورتی تابع را می نویسم؟ مثلا تابع تولید عدد تصادفی کوچکتر از یک
سلام، سوال خوبی هست.
فقط اسم تابع رو بنویسید و پرانتز و ورودیها رو حذف کنید.
ممنون بابت توضیح جالب
سلام
ممنون از شما 🌹🙏
سلام به تیم قوی و پرانرژی شما
لطفاً درباره شبیه سازی دستور ها در محیطeditor هم مثال حل کنید
سلام دوست عزیز 🌹
ممنون از پیشنهادتون
ممنون از زحماتتون
ولی بنظر میاد حل بعضی تمرین ها اشتباهن
سلام،
ممنون که وقت گذاشتید و تمرینها رو حل کردید.
تمرینهای این جلسه چک شدن، مشکلی وجود نداشت. در مثال فاکتوریل، یک اشتباه جزئی وجود داشت (به جای i، حرف بزرگ I نوشته شده بود) که اصلاح شد.
سلام
ممنون بابت آموزش های خوبتون
در تمارین و مثال های جلسات قبل هم اشتباه وجود دارد.
لینک جلسات ۱۹ و ۲۰ کجا قرار دارند؟
سلام
سپاس 🌹🙏
درحال اصلاح تمرینها هستیم. مشکل تمرینات این جلسه رو حل کردیم.
از جلسه 19 به بعد کاربرد محور پیش رفتیم. دیگه مباحث پایه متلب رو در 18 جلسه قبل به اندازه کافی گفتیم. برای دیدن جلسات کاربردی بعدی لطفا به این لینک مراجعه کنید. پستهای آموزش دستورات کاربردی ادامه داره…