یکی از مهمترین بخشهای برنامه نویسی، استفاده از توابع برای انجام دادن راحتتر کار و عدم تکرار یک قطعه کد تکراری است. در این قسمت از دوره آموزش متلب فنولوژی، در مورد انواع تابع در متلب صحبت میکنیم. همچنین نحوه ایجاد تابع در متلب و کار با آنها را به صورت کامل شرح میدهیم. با ما همراه باشید.
تابع در متلب
تابع مجموعه دستوراتی است که یک کار مشخص را انجام میدهند. در متلب توابع به صورت فایلهای جداگانه تعریف میشوند (m فایل در متلب). نام فایل و تابع در متلب باید یکسان باشد. توابع روی متغیرهایی در محدوده کاری خود عمل میکنند (local workspace). این محدوده از محدودهای که در command prompt متلب از آن استفاده میکنید (base workspace) مجزا است. یک تابع در متلب میتوانید بیش از یک آرگومان ورودی و بیش از یک آرگومان خروجی داشته باشد.
سینتکس
در زیر سینتکس تابع در متلب را مشاهده میکنید:
1 |
function [out1,out2, ..., outN] = myfun(in1,in2,in3, ..., inN) |
ساخت تابع
با مثال زیر نشان میدهیم در عمل چگونه میتوان در متلب یک تابع ایجاد کرد و آن را فراخوانی نمود. در اولین گام، در همان پوشهای که میخواهیم تابع را فراخوانی کنیم، یک m فایل جدید به نام تابع (در اینجا mymax.m) ایجاد میکنیم و سپس تابع را به شکل زیر پیاده سازی میکنیم. هدف تابع محاسبهی ماکسیمم پنج عدد داده شده است.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
function max = mymax(n1, n2, n3, n4, n5) %This function calculates the maximum of the % five numbers given as input max = n1; if(n2 > max) max = n2; end if(n3 > max) max = n3; end if(n4 > max) max = n4; end if(n5 > max) max = n5; end |
فراخوانی تابع
همانطور که مشاهده کردید اولین خط تابع با عبارت function شروع میشود. در این مثال تابع دارای پنج ورودی و یک خروجی بود. کامنتهایی که بلافاصله پس از عبارت function میآیند، به عنوان یک توضیح یا help تابع در نظر گرفته میشوند. برای مشاهده این توضیحات در command prompt عبارت help mymax را تایپ کنید. نتیجه به صورت زیر خواهد بود:
1 2 |
This function calculates the maximum of the five numbers given as input |
برای فراخونی تابع، در کامندلاین یا فایلی که در پوشهی یکسان باشد، عبارت زیر را تایپ کنید.
1 |
mymax(34, 78, 89, 23, 11) |
نتیجه به صورت ans = 89 خواهد شد.
توابع ناشناس در متلب
یک تابع ناشناس، مانند توابع یک خطی در زبانهای برنامه نویسی سنتی هستند که در یک جمله در متلب تعریف میشوند. این توابع شامل یک عبارت (expression) و هرچندتا ورودی یا خروجی میشوند. توابع ناشناس در متلب میتوانند مستقیما در کامندلاین یا درون یک تابع یا فایل اسکریپت دیگر ایجاد شوند و دیگر نیازی به ساخت یک m فایل جدید برای تعریف تابع نیست. به سینتکس زیر توجه کنید:
1 |
f = @(arglist)expression |
مثال: به تابع ناشناس زیر توجه کنید. این تابع به نام power، دو آرگومان عدد و توان را میگیرد و در یک عبارت توان را محاسبه میکند.
1 2 3 4 5 |
power = @(x, n) x.^n; result1 = power(7, 3) result2 = power(49, 0.5) result3 = power(10, -10) result4 = power (4.5, 1.5) |
مشاهده نتایج:
1 2 3 4 |
result1 = 343 result2 = 7 result3 = 1.0000e-10 result4 = 9.5459 |
تابع اولیه و زیرتابعها در MATLAB
همانطور که گفتیم همهی توابع در متلب (به جز توابع ناشناس) در یک فایل مجزا باید تعریف شوند. اما این فایلهای مجزا خود به یک تابع اولیه و یک یا چند زیرتابع تقسیم میشوند. تابع اولیه اولین تابع در فایل تابع در متلب است. زیرتابعها پس از تابع اولیه تعریف میشوند و فقط میتوانند در تابع اولیه یا سایر زیرتابعها فراخوانی شوند؛ برخلاف تابع اولیه که میتواند در سایر فایلها با پوشه یکسان یا در command prompt نیز فراخوانی شوند.
مثال: در مثال زیر در یک فایل یک تابع اولیه به نام quadratic تعریف میکنیم که در ورودی پارامترهای یک معادله درجه دو را میگیرد (سه پارامتر a و b و c) و جوابهای معادله (x1 و x2) را خروجی میدهد. درون این فایل یک زیرتابع پس از تابع اولیه تعریف کردیم به نام disc که دلتای معادله را محاسبه میکند و در تابع اولیه فراخوانی و استفاده میشود.
1 2 3 4 5 6 7 8 9 |
function [x1,x2] = quadratic(a,b,c) d = disc(a,b,c); x1 = (-b + d) / (2*a); x2 = (-b - d) / (2*a); end function dis = disc(a,b,c) dis = sqrt(b^2 - 4*a*c); end |
با فراخوانی تابع اولیه در کامند پرامپت quadratic(2,4,-4) متلب نتیجهی ans = 0.7321 را نمایش میدهد.
توابع تو در تو در متلب
میتوان در بدنهی یک تابع در متلب یک تابع دیگر تعریف کرد. به این توابع، توابع تو در تو گفته میشود. به سینتکس زیر توجه کنید:
1 2 3 4 5 6 7 8 |
function x = A(p1, p2) ... B(p2) function y = B(p3) ... end ... end |
مثال: همان مثال قبل را اینبار با توابع تو در تو انجام میدهیم. اگر تابع اولیه را در کامند پرامپت فراخوانی کنید خروجی مانند حالت قبل خواهد شد.
1 2 3 4 5 6 7 8 9 |
function [x1,x2] = quadratic2(a,b,c) function disc d = sqrt(b^2 - 4*a*c); end disc; x1 = (-b + d) / (2*a); x2 = (-b - d) / (2*a); end |
تابع خصوصی در متلب
تابع خصوصی، یک تابع اولیه است که فقط در تعداد محدودی از توابع دیگر قابل استفاده است. برای این کار باید یک فولدر درون فولدر اصلی خود به نام private بسازید و m فایل تابع خصوصی را در آن قرار دهید. در این صورت تنها توابعی که در پوشهی اصلی هستند میتوانند به آن دسترسی داشته باشند.
مثال: همان مثال تابع درجه دو را این بار به صورت تابع خصوصی پیاده سازی میکنیم. برای این کار در پوشهای که تابع quadratic قرار دارد، یه پوشه به نام private میسازیم و یک ام فایل مانند زیر ایجاد میکنیم (با نام disc.m).
1 2 3 |
function dis = disc(a,b,c) dis = sqrt(b^2 - 4*a*c); end |
تابع اصلی نیز که در پوشه بالاتر قرار دارد مانند زیر است:
1 2 3 4 5 6 7 |
function [x1,x2] = quadratic3(a,b,c) d = disc(a,b,c); x1 = (-b + d) / (2*a); x2 = (-b - d) / (2*a); end |
مجددا اگر در کامند پرامپت دستور quadratic3(2,4,-4) را تایپ کنیم نتیجه به صورت ans = 0.73205 خواهد شد.
متغییرهای سراسری در متلب
متغییرهای سراسری میتوانند با بیشاز یک تابع به اشتراک گذاشته شوند. برای این کار باید متغیر را به صورت سراسری یا global تعریف کنید. قبل از اینکه متغییر در تابع فراخوانی شود، باید تعریف شده باشد (در کامند لاین یا فایل اسکریپت اصلی). بهتر است برای تمایز راحتتر، متغییرهای سراسری را با حروف بزرگ نمایش دهیم.
مثال: یک تابع در یک فایل به نام average.m ایجاد کرده و متغییر سراسری TOTAL را در آن تعریف کرده و استفاده میکنیم.
1 2 3 4 |
function avg = average(nums) global TOTAL avg = sum(nums)/TOTAL; end |
1 2 3 4 |
global TOTAL; TOTAL = 10; n = [34, 45, 25, 45, 33, 19, 40, 34, 38, 42]; av = average(n) |