توابع در Matlab (بخش دوم)
در بخش اول از سری مقالات آشنایی با توابع در متلب، با عنوان inline و نحوه عملکرد آن برای تعریف یک تابع آشنا شدیم. در ادامه با توابع ناشناس (Anonymous Functions) آشنا خواهیم شد. تابع ناشناس همانند توابع inline، نیاز به ذخیره در محل مشخصی ندارد، بلکه با یک متغیر که نوع داده آن function_handle است مرتبط میشود. توابع ناشناس، همانند دیگر توابع استاندارد، می توانند ورودیهایی بپذیرند و خروجی های مشخصی را برگردانند. این در حالیست که، آنها می توانند تنها یک عبارت اجرایی واحد داشته باشند.
تعریف تابع ناشناس
مشخصه اصلی این توابع علامت (@) است. درواقع این علامت همانند کلمه inline عمل کرده و با آن میتوان تابع ناشناس را تعریف نمود. روش کلی تعریف این توابع به شکل زیر است.
عبارت تابع(متغیرها)@=نام تابع
برای مثال خواهیم داشت:
sqr = @(x) x.^2;
در اینجا sqr نام تابع است. این نام handle این تابع میباشد و توسط (@) تعریف میشود. فراخوانی تابع با این نام صورت میگیرد.این تابع ناشناس یک ورودی را دریافت می کند و به صورت ضمنی یک خروجی را برمیگرداند، یک آرایه با همان اندازه از x که حاوی مقادیر مربع آن است. بسیاری از توابع متلب، توابع ناشناس را بعنوان ورودی میشناسند و مستقیم میتوان از آنها استفاده کرد. بعنوان مثال برای محاسبه مقدار انتگرال تابع از ۰ تا ۱ میتوان به صورت زیر عمل کرد:
q = integral(sqr,0,1);
اما باتوجه به نکتهی قبل خواهیم داشت:
q = integral(@(x) x.^2,0,1);
همچنین در ضمن تعریف تابع بعد از علامت (@) میتوان علاوه بر عبارت های تابع از ضرایب دیگری نیز استفاده کرد.
a=1; b=5; yy=@(x) a*x.^2 + b; x=1; yy(x)
تابع yy بر اساس ضرایب ثابت a ,b تعریف شده است. تعریف این ضرایب باید حتماً قبل از تعریف تابع ناشناس صورت گیرد. اگر مقادیر ضرایب ثابت تغییر کند و یا پاک شود همچنان تابع ناشناس مقدار قبل را در خود نگه میدارد. برای تغییر مقدار این ضرایب باید از نو تابع را تعریف کرد.
>> clear a b >> yy(x)
با نوشتن دو خط بالا مقادیر a,b از Workspace پاک میشود. اما نتیجه همچنان مقدار قبلی است.
کاربر میتواند جهت ذخیرهی تابع و ضرایب مربوط به آن در Mat-file جداگانه، از دستور زیر استفاده نماید. بدین صورت بارگذاری مجدد آن در هر زمانی دیگری امکان پذیر خواهد بود.
save myfile.mat parabola
تابع ناشناس چندگانه
عبارت تابع ناشناس میتواند شامل چند تابع ناشناس دیگر باشد. حل معادلهی زیر در بازهی ۰ تا ۱ مثالی از این نوع کاربرد است.
y = @(a) (integral(@(x) (x.^3 - a*x.^2 -2),0,1)); y(1)
در واقع در دستور بالا در قدم اول انتگرال بصورت تابع ناشناس تعریف شد.
@(x) (x.^3 - a*x.^2 -2)
سپس محاسبه انتگرال در بازه مد نظر همراه با انتقال ضریب a انجام شد.
integral(@(x) (x.^3 - a*x.^2 -2),0,1)
با ساخت یک تابع ناشناس و تعریف a بعنوان پارامتر آن، محاسبه جواب میسر خواهد بود.
@(a) (integral(@(x) (x.^3 - a*x.^2 -2),0,1))
توابع ناشناس با چند ورودی و خروجی
برای تعریف تابع در این حالت باید آرگومان ها به درستی تعریف شوند. ورودی ها نیز باید با علامت کاما (,) از یکدیگر جدا شوند. به مثال زیر دقت کنید:
myf = @(x,y) (x^2 + y^2 + x*y); x = 1; y = 2; z = myf(x,y)
وقتی که یک تابع ناشناس ایجاد میکنید، صریحاً آرگومان خروجی را تعریف نمیکنید. اگر عبارت در تابع، خروجی های چندگانه را بازمیگرداند، میتوانید آنها را هنگام درخواست تابع فرا بخوانید. متغیرهای خروجی چندگانه را در براکت ([]) قرار دهید. برای مثال، تابع ndgrid مقادیر x ,y ورودی را با توجه به میزان پیش روی x/c، تقسیم بندی میکند.
c = 10; mygrid = @(x,y) ndgrid((-x:x/c:x),(-y:y/c:y)); [x,y] = mygrid(pi,2*pi);
از خروجی تایع mygrid میتوانیم بعنوان ورودی تابع mesh استفاده کنیم.
z = sin(x) + cos(y); mesh(x,y,z)
آرایه های توابع ناشناس
اگرچه بیشتر انواع دادههای MATLAB از آرایه های چند بعدی پشتیبانی می کنند، ولی شما می توانید تابع را با استفاده از آرایه سلولی (cell array) یا آرایه ساختار (structure array) ذخیره کنید. رایج ترین روش استفاده از یک آرایه سلولی همانند زیر است.
f = {@(x)x.^2; @(y)y+10; @(x,y)x.^2+y+10};
هنگام ایجاد آرایه سلولی، در نظر داشته باشید که MATLAB فاصله ها را به عنوان جدا کننده ستون تفسیر می کند. برای استفاده از این تابع نیز مثل فراخوانی آرایه ای سلولی، از علامت آکولاد ({}) استفاده میشود.
x = 1; y = 10; f{1}(x) f{2}(y) f{3}(x,y)
بطور خلاصه، در این مقاله با مفهوم توابع ناشناس آشنا شدیم. دیدیم که چگونه میتوان آنها را تعریف کرد و در شکل های مختلف آنها را فراخوانی نمود. در نهایت توابعی که از اهمیت بیشتری برخوردار هستند را برای بارگذاری های مجدد ذخیره کرد. در ادامه، با ساخت تابع با استفاده از M-file با ما همراه باشید.
دیدگاهتان را بنویسید
برای نوشتن دیدگاه باید وارد بشوید.