یادگرفتن فانکشن نویسی از ضروریات مهم برنامه نویسی است. در برنامه های محاسباتی بلند، بهترین روش برای کاهش خطاهای برنامه نویسی استفاده از فانکشن نویسی است. با استفاده از فانکشن به جای اینکه کل برنامه (مثلا ۵۰۰۰ خط) در یک فایل ران شود به صورت پیوسته در چندین فایل اجرا می گردد. و تمامی قسمت های مختلف در فایل های جداگانه اجرا می گردد و سرآخر نتیجه آخری را در یک فایل به ما برمیگرداند.
از سری آموزش های برنامه نویسی در متلب، در این پست به طور کامل به آموزش فانکشن نویسی در متلب پرداخته می شود که به ترتیب فانکشن های ناشناخته، فانکشن های اولیه و زیر فانکشن ها، فانکشن های تو در تو، فانکشن های خصوصی و متغیرهای جهانی یا عمومی (متغیرهایی که در هر صفحه ای می توان یافت)
یک فانکشن یک گروه از دستورات است که با هم یک کار را انجام می دهند. در متلب MATLAB، توابع در فایل های جداگانه تعریف می شوند. نام فایل و فانکشن باید همان باشد.
فانکشن بر روی متغیرها در فضای کاری خود کار می کنند، که همچنین فضای کاری محلی است، جدا از فضای کاری که در خط فرمان MATLAB دسترسی پیدا می کنید که فضای کاری پایه نامیده می شود.
فانکشن می توانند بیش از یک آرگمان ورودی را پذیرفته و ممکن است بیش از یک آرگمان خروجی را بازگرداند.
حالت بیان یک فانکشن به صورت زیر می باشد:
function [out1,out2, ..., outN] = myfun(in1,in2,in3, ..., inN)
مثال
فانکشن زیر به نام mymax باید در یک فایل با نام mymax.m نوشته شود. پنج عدد به عنوان ورودی می گیرد و مقدار ماکزیمم آن ها را باز می گرداند.
یک فایل فانکشن به نام mymax.m ایجاد کنید و کد زیر را در آن بنویسید –
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) شروع می شود. این نام فانکشن (function) و آرگمان ورودی را می دهد. در مثال ما، تابع mymax دارای پنج آرگمان ورودی و یک آرگومان خروجی است.
خطوط اظهار نظر که بلافاصله بعد از عبارت فانکشن به متن کمک می کنند. این خطوط هنگام تایپ چاپ می شوند.
help mymax
نرم افزار متلب کد بالا را اجرا می کند و نتیجه زیر را برمی گرداند –
This function calculates the maximum of the
five numbers given as input
:شما می توانید فانکشن را به صورت زیر فراخوانی کنید
mymax(34, 78, 89, 23, 11)
متلب دستور بالا را اجرا می کند و نتیجه زیر را برمی گرداند –
ans = 89
آموزش فانکشن نویسی در متلب: فانکشن های ناشناس (بی نام)
یک فانکشن ناشناس مانند یک فانکشن inline در زبان برنامه نویسی سنتی است که در یک تک عبارت MATLAB تعریف شده است. این شامل یک تک عبارت MATLAB و هر تعداد آرگمان ورودی و خروجی است.
شما می توانید یک فانکشن ناشناس را در خط فرمان MATLAB یا در یک فانکشن یا در اسکریپت تعریف کنید.
به این ترتیب شما می توانید بدون نیاز به ایجاد یک فایل برای آنها، یک فانکشن ساده ایجاد کنید.
نحوه ی ایجاد یک فانکشن ناشناس از یک عبارت به صورت زیر بیان می شود:
f = @(arglist)expression
مثال
در این مثال، یک تابع ناشناس با نام power را بنویسید که دو عدد را به عنوان ورودی می گیرد و عدد اول را به توان عدد دوم برساند و برگرداند.
power = @(x, n) x.^n;
result1 = power(7, 3)
result2 = power(49, 0.5)
result3 = power(10, -10)
result4 = power (4.5, 1.5)
هنگامی که شما فایل را اجرا می کنید، نتایج زیر را نمایش می دهد –
result1 = 343
result2 = 7
result3 = 1.0000e-10
result4 = 9.5459
آموزش فانکشن نویسی در متلب: فانکشن اولیه و زیر فانکشن ها
هر فانکشنی به غیر از فانکشنی ناشناس باید در یک فایل تعریف شود. هر فایل فانکشن حاوی یک فانکشن اولیه ضروری است که ابتدا ظاهر می شود و هر تعداد زیر فانکشن اختیاری است که بعد از فانکشن اصلی می تواند بیاید و از آن استفاده شود.
فانکشن اولیه را می توان از خارج از فایل که آنها را تعریف می کند فراخوانی کرد یا از خط فرمان و یا از سایر فانکشن ها، اما زیر فانکشن ها را نمی توان از خط فرمان یا سایر فانکشن ها، خارج از فایل فانکشن فراخوانی شوند.
زیر فانکشن ها فقط برای فانکشن اولیه و سایر زیر فانکشن ها ی درون فانکشن اولیه که آنها را تعریف می کند قابل مشاهده است.
مثال
اجازه بدهید یک فانکشن به نام quadratic بنویسیم که ریشه های یک معادله درجه دوم را محاسبه کند. این فانکشن سه ورودی می گیرد که به ترتیب ضرایب یک معادله درجه دوم هستند و ریشه های آن را برمیگرداند:
فایل فانکشن quadratic.m شامل فانکشن اصلی درجه دوم و فانکشن discزیر فانکشن است که به صورت جدا محاسبه می کند
unction [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
شما می توانید از فانکشن فوق را سریع از فرمان command به صورت فراخوانی کنید
quadratic(2,4,-4)
MATLAB دستور بالا را اجرا می کند و نتیجه زیر را برمی گرداند
ans = 0.7321
آموزش فانکشن نویسی در متلب: فانکشن های تو در تو(Nested Functions)
شما می توانید فانکشن را در داخل یک فانکشن دیگر تعریف کنید. این ها فانکشن تو در تو نامیده می شوند. یک فانکشن تو در تو شامل هر یا همه اجزای هر فانکشن دیگر است.
فانکشن تو در تو در محدوده فانکشن دیگری تعریف شده اند. آنها دسترسی به فضای کاری فانکشن موجود را به اشتراک میگذارند.
یک فانکشن تو در تو از حالت زیر پیروی می کند
function x = A(p1, p2)
...
B(p2)
function y = B(p3)
...
end
...
end
مثال
اجازه دهید فانکشن quadratic را بازنویسی کنیم، با این حال، این بار فانکشن disc یک فانکشن تو در تو است.
یک فایل فانکشن quadratic2.m ایجاد کنید و کد زیر را در آن بنویسید
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
شما می توانید از فانکشن فوق از فرمان command سریع تر فراخوانی کنید
quadratic2(2,4,-4)
MATLAB دستور بالا را اجرا می کند و نتیجه زیر را برمی گرداند
ans = 0.73205
آموزش فانکشن نویسی در متلب: فانکشن های خصوصی (Private Functions)
یک فانکشن خصوصی یک فانکشن اولیه است که فقط برای یک گروه محدود از سایر فانکشن ها قابل مشاهده است. اگر نمیخواهید پیاده سازی یک فانکشن (ها) را نمایش دهید، می توانید آنها را به عنوان فانکشن خصوصی ایجاد کنید.
فانکشن خصوصی در زیر پوشه ها با نام ویژه خصوصی هستند. آنها فقط برای فانکشن ها در پوشه اصلی قابل مشاهده اند.
مثال
اجازه دهید فانکشن quadratic را بازنویسی کنیم. با این حال، این بار، فانکشن disc برای محاسبه تفکیک شده و یک فانکشن خصوصی باشد.
یک زیر پوشه به نام خصوصی در دایرکتوری فضای کار ایجاد کنید فایل فانکشن disk.m را در آن ذخیره کنید
function dis = disc(a,b,c)
%function calculates the discriminant
dis = sqrt(b^2 - 4*a*c);
end % end of sub-function
یک فانکشن quadratic3.m را در دایرکتوری فضای کار خود ایجاد کنید و کد زیر را در آن بنویسید
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
شما می توانید از فانکشن فوق از فرمان command سریع تر فراخوانی کنید
quadratic3(2,4,-4)
MATLAB دستور بالا را اجرا می کند و نتیجه زیر را برمی گرداند
ans = 0.73205
آموزش فانکشن نویسی در متلب: متغیرهای جهانی (سراسری یا عمومی) (Global Variables)
متغیرهای جهانی یا عمومی را می توان با بیش از یک فانکشن به اشتراک گذاشت. برای این، شما باید متغیر را به عنوان جهانی(عمومی) در تمام فانکشن ها اعلام کنید.
اگر می خواهید به آن متغیر در فضای کاری پایه دسترسی پیدا کنید، سپس متغیر را در خط فرمان اعلام کنید.
اعلام جهانی یا عمومی بودن متغیر باید قبل از اینکه در یک فانکشن استفاده شود رخ می دهد.
برای تمرین بهتر است از حروف بزرگ برای نام متغیرهای جهانی برای تشخیص آنها از متغیرهای دیگر استفاده شود.
مثال
اجازه دهید یک فایل فانکشن به نام average.m ایجاد کنیم و کد زیر را در آن بنویسیم –
function avg = average(nums)
global TOTAL
avg = sum(nums)/TOTAL;
end
یک فایل اسکریپت ایجاد کنید و کد زیر را در آن بنویسید
global TOTAL;
TOTAL = 10;
n = [34, 45, 25, 45, 33, 19, 40, 34, 38, 42];
av = average(n)
هنگام اجرای فایل، نتیجه زیر نمایش داده می شود
av = 35.500