توابع در زبان متلب
تابع یک گروه از دستورات است که با هم یک وظیفه را انجام می دهند. در زبان متلب توابع در فایل های جداگانه تعریف می شوند. نام فایل و تابع باید یکسان باشد. توابع بر روی متغیرهایی که در workspace خودشان قرار دارد (local workspace نیز گفته می شود) عمل می کند. توابع می توانند بیشتر از یک آرگومان ورودی داشته باشند و همنین می توانند بیش از یک آرگومان خروجی داشته باشند. سینتکس مربوط به یک تابع در متلب:
1 | function [out1,out2, ..., outN] = myfun(in1,in2,in3, ..., inN) |
مثال:
تابعی که در مثال زیر تعریف شده (تابع mymax) باید در داخل فایل mymax.m نوشته شود. این تابع 5 عدد به عنوان ورودی می گیرد و بزرگترین آنها را به عنوان خروجی برمیگرداند. یک فایل با نام 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 شروع می شود و به دنبال آن آرگومان خروجی و بعد از آن نام و ترتیب آرگومان های ورودی مشخص می شود. دو خط بعدی که کامنت خوانده می شوند راهنمای تابع هستند. این راهنما زمانی که دستور زیر را تایپ کنید نمایش داده می شوند:
1 | help mymax |
خروجی:
1 2 | This function calculates the maximum of the five numbers given as input |
برای فراخوانی تابع فوق می توانیم به شکل زیر عمل کنیم:
1 | mymax(34, 78, 89, 23, 11) |
خروجی:
1 | ans = 89 |
توابع بی نام (Anonymous)
یک تابع بی نام مانند تابع inline در زبان های برنامه نویسی سنتی است. شما می توانید یک تابع بی نام را در خط فرمان متلب و یا در داخل فایل اسکرپیت تعریف کنید. این روشی است که با آن می توان توابع ساده را بدون ایجاد فایل برای آن ها ایجاد کرد. در زیر می توانید سینتکس مربوط به تابع بی نام را مشاهده کنید:
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 |
توابع اصلی و فرعی
همه توابع به غیر از تابع بی نام باید در داخل یک فایل تعریف شوند. هر فایل تابع شامل یک تابع اصلی لازم است که در ابتدا تعریف می شود و هر تعدادی از توابع فرعی (sub-functions) که بعد از تابع اصلی تعریف و توسط تابع اصلی استفاده می شود.
توابع اصلی را می توان بیرون از فایلی که در آن تعریف شده اند، فراخوانی کرد اما توابع فرعی این قابلیت را ندارند. توابع فرعی فقط برای تابع اصلی و سایر توابع فرعی تعریف شده در آن فایل قابل مشاهده هستند.
مثال:
در این مثال یک تابع به نام quadratic ایجاد می کنیم که کارش محاسبه ریشه یک معادله درجه دوم است. یک فایل با نام quadratic.m ایجاد کرده و تابع اصلی quadratic و تابع فرعی disc را مانند نمونه زیر در آن بنویسید:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | function [x1,x2] = quadratic(a,b,c) %this function returns the roots of % a quadratic equation. % It takes 3 input arguments % which are the co-efficients of x2, x and the %constant term % It returns the roots d = disc(a,b,c); x1 = (-b + d) / (2*a); x2 = (-b - d) / (2*a); end % end of quadratic function dis = disc(a,b,c) %function calculates the discriminant dis = sqrt(b^2 - 4*a*c); end % end of sub-function |
شما می توانید تابع فوق را از خط فرمان به شکل زیر فراخوانی کنید:
1 | quadratic(2,4,-4) |
خروجی:
1 | ans = 0.7321 |
توابع تو در تو
شما می توانید توابع را در داخل بدنه یک تابع دیگر تعریف کنید. به این نوع توابع، توابع تو در تو گفته می شود. توابع تو در تو در محدود تابع دیگر تعریف می شوند و دسترسی به workspace را به اشتراک می گذارند. در زیر می توانید سینتکس مربوط به تابع تو در تو را مشاهده کنید:
1 2 3 4 5 6 7 8 | function x = A(p1, p2) ... B(p2) function y = B(p3) ... end ... end |
مثال:
یگ فایل با نام quadratic2.m ایجاد کرده و کد زیر را در آن بنویسید:
1 2 3 4 5 6 7 8 9 | function [x1,x2] = quadratic2(a,b,c) function disc % nested function d = sqrt(b^2 - 4*a*c); end % end of function disc disc; x1 = (-b + d) / (2*a); x2 = (-b - d) / (2*a); end % end of function quadratic2 |
شما می توانید تابع فوق را از خط فرمان به شکل زیر فراخوانی کنید:
1 | quadratic2(2,4,-4) |
خروجی:
1 | ans = 0.73205 |
توابع خصوصی (Private)
تابع خصوصی یک تابع اصلی است که فقط برای گروه محدودی از توابع دیگر قابل مشاهده است. اگر نمی خواهید جزئیات پیادهسازی یک تابع آشکار باشد، می توانید آن را صورت private تعریف کنید. توابع خصوصی در زیرپوشه هایی با نام private قرار می گیرند و فقط برای توابعی که در پوشه والد قرار دارند، قابل مشاهده هستند.
مثال:
در این مثال تابع quadratic را تغییر می دهیم. این بار تابع disc به صورت private خواهد بود. یک زیرپوشه به نام private ایجاد کرده و یک فایل با نام disc.m در آن ایجاد کرده و کد زیر را در آن بنویسید:
1 2 3 4 5 | function dis = disc(a,b,c) %function calculates the discriminant dis = sqrt(b^2 - 4*a*c); end % end of sub-function |
یک فایل دیگر با نام quadratic3.m در پوشه والد ایجاد کرده و کد زیر را در آن بنویسید:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | function [x1,x2] = quadratic3(a,b,c) %this function returns the roots of % a quadratic equation. % It takes 3 input arguments % which are the co-efficient of x2, x and the %constant term % It returns the roots d = disc(a,b,c); x1 = (-b + d) / (2*a); x2 = (-b - d) / (2*a); end % end of quadratic3 |
شما می توانید تابع فوق را از خط فرمان به شکل زیر فراخوانی کنید:
1 | quadratic3(2,4,-4) |
خروجی:
1 | ans = 0.73205 |
متغیرهای سراسری (Global)
متغیرهای سراسری می توانند توسط بیش از یک تابع به اشتراک گذاشته شوند. برای این کار شما باید متغیر را در تمام توابع به صورت global اعلان کنید. اگر می خواهید به آن متغیر از base workspace دسترسی داشته باشید، پس باید آن در خط فرمان اعلان کنید. بهتر است برای نام متغیرهای سراسری از حروف بزرگ استفاده کنید تا بتوان آن ها را از سایر متغیرها تشخیص داد.
مثال:
یک فایل با نام average.m ایجاد کرده و کد زیر را در آن بنویسید:
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) |
خروجی:
1 | av = 35.500 |
هیچ نظری ثبت نشده است