[آموزش] توابع در متلب

P O U R I A

مدیر مهندسی شیمی مدیر تالار گفتگوی آزاد
مدیر تالار
فهرست مطالب تاپیک:

  1. توابع داخلی در متلب
  2. تعریف توابع در متلب با دستور inline
  3. ساخت تابع در متلب با استفاده از m-file
  4. تعیین یک یا چند متغیر، به عنوان ورودی های دلخواه تابع (کاربر به دلخواه، می تواند آنها را به عنوان ورودی، به تابع بدهد یا خیر)، هنگام تعریف تابع با دستور function در متلب
  5. شیوه های به کار بردن توابع داخلی متلب
  6. مشاهده کدهای توابع متلب با دستور type
  7. تشخیص تعداد ورودی های یک تابع با دستور nargin
  8. تشخیص تعداد خروجی های یک تابع با دستور nargout


منبع:kelidestan.com
 
آخرین ویرایش:

P O U R I A

مدیر مهندسی شیمی مدیر تالار گفتگوی آزاد
مدیر تالار
توابع داخلی در متلب

توابع داخلی در متلب

منظور از توابع داخلی، توابعی است که در نرم افزار متلب وجود دارند و هر یک عمل خاصی را انجام می دهند و چندین حرف برای نامگذاری آنها به کار رفته است.به عنوان مثال می توان توابع sin ، cos و tan را نام برد که همان توابع مثلثاتی مشهور در ریاضیات می باشند. این توابع، یک عدد را دریافت کرده و به ترتیب، نتیجه سینوس، کسینوس و تانژانت آن را در خروجی نمایش می دهند.باید توجه داشته باشید که چون نرم افزار متلب به هر یک از این توابع، یک دستور اختصاص داده است، بنابراین در مباحث دیگر ممکن است از لفظ دستور sin ، دستور cos و ... استفاده کنیم و در واقع حجم زیادی از دستورات متلب را که به کار می بریم، توابع داخلی متلب می باشند که توسط تیم توسعه دهنده این نرم افزار، ساخته شده اند و ما با دستورات متلب از آنها استفاده می کنیم.در جدول زیر، تعدادی از توابع داخلی matlab را برای نمونه آورده ایم :
تابععملکرد تابعدستور در متلب
sinمحاسبه سینوسsin
cosمحاسبه کسینوسcos
tanمحاسبه تانژانتtan
مثال :


کد:
[LEFT][COLOR=#000000][FONT=Tahoma][FONT=monospace]A=[COLOR=#0000FF]cos[/COLOR][COLOR=#008800]([/COLOR][COLOR=#3333FF]0[/COLOR][COLOR=#008800])[/COLOR][/FONT]
[/FONT][/COLOR][/LEFT]
نتیجه :


کد:
[LEFT][COLOR=#000000][FONT=Tahoma][FONT=monospace]A =
 
     [COLOR=#3333FF]1[/COLOR][/FONT]
[/FONT][/COLOR][/LEFT]


 

P O U R I A

مدیر مهندسی شیمی مدیر تالار گفتگوی آزاد
مدیر تالار
تعریف توابع در متلب با دستور inline

تعریف توابع در متلب با دستور inline

برای آن که بتوانیم توابع مورد نظر خود را در متلب تعریف کنیم، به شیوه های مختلفی می توانیم عمل کنیم که یکی از آنها استفاده از دستور inline می باشد. به مثال زیر توجه کنید :

مثال :

فرض کنید بخواهیم تابع f را به صورت یک چند جمله ای از x تعریف کنیم. می نویسیم :
کد:
[LEFT][COLOR=#000000][FONT=Tahoma][FONT=monospace]f=[COLOR=#0000FF]inline[/COLOR][COLOR=#008800]([/COLOR][COLOR=#A020F0]'x^2+2*x+1'[/COLOR],[COLOR=#A020F0]'x'[/COLOR][COLOR=#008800])[/COLOR][/FONT]
[/FONT][/COLOR][/LEFT]

نتیجه :


کد:
[LEFT]
[COLOR=#000000][FONT=Tahoma][FONT=monospace]f =
 
     [COLOR=#0000FF]Inline[/COLOR] [COLOR=#0000FF]function[/COLOR]:
     f[COLOR=#008800]([/COLOR]x[COLOR=#008800])[/COLOR] = x^[COLOR=#3333FF]2[/COLOR]+[COLOR=#3333FF]2[/COLOR]*x+[COLOR=#3333FF]1[/COLOR][/FONT]
[/FONT][/COLOR][/LEFT]
درون پرانتز دستور inline ، عبارت اول برابر چندجمله ای و عبارت دوم، متغیر را مشخص می کند. در دستور فوق می توانیم عبارت 'x' را که متغیر را مشخص می کند، حذف کنیم، زیرا دستور inline می تواند آن را حدس بزند. به مثال زیر توجه کنید :

مثال :

فرض کنید بخواهیم تابع f را به صورت یک چند جمله ای از x تعریف کنیم. می نویسیم :
کد:
[LEFT]
[COLOR=#000000][FONT=Tahoma][FONT=monospace]f=[COLOR=#0000FF]inline[/COLOR][COLOR=#008800]([/COLOR][COLOR=#A020F0]'x^2+2*x+1'[/COLOR][COLOR=#008800])[/COLOR][/FONT]
[/FONT][/COLOR][/LEFT]
نتیجه :


کد:
[LEFT]
[COLOR=#000000][FONT=Tahoma][FONT=monospace]f =
 
     [COLOR=#0000FF]Inline[/COLOR] [COLOR=#0000FF]function[/COLOR]:
     f[COLOR=#008800]([/COLOR]x[COLOR=#008800])[/COLOR] = x^[COLOR=#3333FF]2[/COLOR]+[COLOR=#3333FF]2[/COLOR]*x+[COLOR=#3333FF]1[/COLOR][/FONT]
[/FONT][/COLOR][/LEFT]
حال در مثال زیر نشان می دهیم که چگونه تابع تعریف شده، مقدار متغیر x را دریافت کرده و نتیجه را در خروجی نمایش می دهد :

مثال :


کد:
[LEFT]
[COLOR=#000000][FONT=Tahoma][FONT=monospace]f=[COLOR=#0000FF]inline[/COLOR][COLOR=#008800]([/COLOR][COLOR=#A020F0]'x^2+2*x+1'[/COLOR][COLOR=#008800])[/COLOR]
f[COLOR=#008800]([/COLOR][COLOR=#3333FF]2[/COLOR][COLOR=#008800])[/COLOR][/FONT]
[/FONT][/COLOR][/LEFT]
نتیجه :


کد:
[LEFT]
[COLOR=#000000][FONT=Tahoma][FONT=monospace]f =
 
     [COLOR=#0000FF]Inline[/COLOR] [COLOR=#0000FF]function[/COLOR]:
     f[COLOR=#008800]([/COLOR]x[COLOR=#008800])[/COLOR] = x^[COLOR=#3333FF]2[/COLOR]+[COLOR=#3333FF]2[/COLOR]*x+[COLOR=#3333FF]1[/COLOR]
 
 
[COLOR=#0000FF]ans[/COLOR] =
 
     [COLOR=#3333FF]9[/COLOR][/FONT]
[/FONT][/COLOR][/LEFT]
تابع تعریف شده قبلی، تنها قادر است که در ورودی، یک مقدار را برای متغیر x دریافت کرده و سپس نتیجه را نمایش دهد. فرض کنید که بخواهیم تابع در ورودی، یک بردار را دریافت کرده و سپس مقدار تابع را برای هر عنصر آن بردار محاسبه کند، برای این منظور باید در عبارتی که برای تعریف تابع به کار می بریم، از vectorize استفاده کنیم. به مثال زیر توجه کنید :

مثال :


کد:
[LEFT]
[COLOR=#000000][FONT=Tahoma][FONT=monospace]f=[COLOR=#0000FF]inline[/COLOR][COLOR=#008800]([/COLOR][COLOR=#0000FF]vectorize[/COLOR][COLOR=#008800]([/COLOR][COLOR=#A020F0]'x^2+2*x+1'[/COLOR][COLOR=#008800])[/COLOR],[COLOR=#A020F0]'x'[/COLOR][COLOR=#008800])[/COLOR]
A=[COLOR=#3333FF]1[/COLOR]:[COLOR=#3333FF]5[/COLOR]
f[COLOR=#008800]([/COLOR]A[COLOR=#008800])[/COLOR][/FONT]
[/FONT][/COLOR][/LEFT]
نتیجه :


کد:
[LEFT]
[COLOR=#000000][FONT=Tahoma][FONT=monospace]f =
 
     [COLOR=#0000FF]Inline[/COLOR] [COLOR=#0000FF]function[/COLOR]:
     f[COLOR=#008800]([/COLOR]x[COLOR=#008800])[/COLOR] = x.^[COLOR=#3333FF]2[/COLOR]+[COLOR=#3333FF]2[/COLOR].*x+[COLOR=#3333FF]1[/COLOR]
 
 
A =
 
     [COLOR=#3333FF]1[/COLOR]     [COLOR=#3333FF]2[/COLOR]     [COLOR=#3333FF]3[/COLOR]     [COLOR=#3333FF]4[/COLOR]     [COLOR=#3333FF]5[/COLOR]
 
 
[COLOR=#0000FF]ans[/COLOR] =
 
     [COLOR=#3333FF]4[/COLOR]     [COLOR=#3333FF]9[/COLOR]    [COLOR=#3333FF]16[/COLOR]    [COLOR=#3333FF]25[/COLOR]    [COLOR=#3333FF]36[/COLOR][/FONT]
[/FONT][/COLOR][/LEFT]

تعریف توابع شامل دو متغیر در متلب با دستور inline :
برای تعریف توابع دو متغیره، درون پرانتز دستور inline ، ابتدا باید عبارت تابع را نوشته و سپس نماد دو متغیر را به ترتیب مشخص کنیم. به مثال زیر توجه کنید :

مثال :


کد:
[LEFT]
[COLOR=#000000][FONT=Tahoma][FONT=monospace]f=[COLOR=#0000FF]inline[/COLOR][COLOR=#008800]([/COLOR][COLOR=#A020F0]'x^2+2*y'[/COLOR][COLOR=#008800])[/COLOR]
f[COLOR=#008800]([/COLOR][COLOR=#3333FF]1[/COLOR],[COLOR=#3333FF]2[/COLOR][COLOR=#008800])[/COLOR][/FONT]
[/FONT][/COLOR]
[/LEFT]
نتیجه :


کد:
[LEFT][COLOR=#000000][FONT=Tahoma]
[FONT=monospace]f =
 
     [COLOR=#0000FF]Inline[/COLOR] [COLOR=#0000FF]function[/COLOR]:
     f[COLOR=#008800]([/COLOR]x,y[COLOR=#008800])[/COLOR] = x^[COLOR=#3333FF]2[/COLOR]+[COLOR=#3333FF]2[/COLOR]*y
 
 
[COLOR=#0000FF]ans[/COLOR] =
 
     [COLOR=#3333FF]5[/COLOR][/FONT]
[/FONT][/COLOR][/LEFT]


 

P O U R I A

مدیر مهندسی شیمی مدیر تالار گفتگوی آزاد
مدیر تالار
ساخت تابع در متلب با استفاده از m-file

ساخت تابع در متلب با استفاده از m-file

در متلب با استفاده از دستور inline نیز می توان تابع ساخت، اما ساخت تابع با استفاده از m-file انتخابی حرفه ای تر می باشد. معمولا برنامه نویسان حرفه ای، چارچوب برنامه را در یک فایل اصلی می نویسند و بخش های مختلف برنامه را به صورت تابع هایی می نویسند که یک یا چند ورودی را دریافت کرده و محاسبات لازم را انجام می دهند و سپس یک یا چند خروجی را بر می گردانند. برنامه نویس، عملکرد هر تابع را جداگانه چک می کند و سپس زمانی که از بابت آنها خیالش راحت شد، تمرکز اصلی خود را بر روی فایل اصلی که حاوی چارچوب برنامه می باشد، می گذارد و تنها در فایل اصلی، ارجاعاتی به توابع ساخته شده خواهد داد.چنانچه شما هم از این شیوه استفاده کنید، پس از مدتی صاحب بانکی از توابع خواهید شد که در نوشتن برنامه های جدید، بسیار به شما کمک می کند.با مثالی ساده، نحوه ساخت یک تابع با استفاده از m-file را شرح می دهیم :

مثال :

می خواهیم تابعی به نام add بسازیم که در ورودی، دو عدد را دریافت کرده و سپس مجموع آن دو عدد را در خروجی برگرداند. ابتدا یک m-file خالی باز می کنیم و کد زیر را در آن می نویسیم :
کد:
[LEFT][COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#0000FF]function[/COLOR] [COLOR=#008800][[/COLOR]z[COLOR=#008800]][/COLOR] = add[COLOR=#008800]([/COLOR]x,y[COLOR=#008800])[/COLOR]
[/FONT][/FONT][/COLOR]
[COLOR=#000000][FONT=Tahoma][FONT=monospace]z=x+y;[/FONT]
[/FONT][/COLOR][/LEFT]
در کد متلب بالا، کلمه function اعلام می کند که این m-file به صورت یک تابع می باشد. خروجی با نام z و دو ورودی با نام های x و y مشخص شده اند. کلمه ای که بعد از علامت تساوی قرار می گیرد (در اینجا کلمه add)، نام تابع را مشخص می کند و باید در مرحله بعد، m-file را دقیقا با همین نام ذخیره کنیم. بنابراین m-file را با نام add ذخیره می کنیم.همان طور که مشاهده کردید، خط اول، ساختار تابع را مشخص می کند و در خط های بعدی، تنها کاری که باید انجام دهیم، این است که روابط بین ورودی ها و خروجی را تعریف کنیم که در این مثال، تنها یک جمع ساده می باشد.پس از ذخیره کردن m-file ، دیگر کاری با آن نداریم. باید دقت کنید که اگر بخواهید این m-file را با گزینه Save and run در بالای پنجره، اجرا کنید، با یک خطا مواجه می شوید، زیرا این m-file یک تابع است و باید ورودی هایی برای آن تعریف کنیم.اکنون باید تابع ساخته شده را تست کنیم. دستور زیر را در پنجره Command می نویسیم (و یا در یک m-file دیگر) :
کد:
[LEFT]
[COLOR=#000000][FONT=Tahoma][FONT=monospace]B=[COLOR=#3333FF]2[/COLOR];
C=[COLOR=#3333FF]3[/COLOR];
A=add[COLOR=#008800]([/COLOR]B,C[COLOR=#008800])[/COLOR][/FONT]
[/FONT][/COLOR]
[/LEFT]
نتیجه :


کد:
[LEFT][COLOR=#000000][FONT=Tahoma][FONT=monospace]A =
 
     [COLOR=#3333FF]5[/COLOR][/FONT]
[/FONT][/COLOR][/LEFT]
نکته :

باید m-file تابع درون Current folder و یا سایر مسیرهای مشخص شده برای نرم افزار متلب باشد. در غیر این صورت، متلب یک پیام خطا را نمایش می دهد. این پیام خطا، به این دلیل است که متلب نمی تواند m-file با نام add را پیدا کند.

نکته :
در دستور فوق مشاهده کردیم که نام هایی که برای ورودی و خروجی تابع add استفاده کردیم (A و B و C)، با نام های درون خود کدهای تابع add ، متفاوت است (x و y و z). بنابراین احتیاجی نیست که نگران نام های به کار رفته در ساختار تابع باشید و از هر نام دلخواهی برای ارجاع به تابع می توانید استفاده کنید.
 

P O U R I A

مدیر مهندسی شیمی مدیر تالار گفتگوی آزاد
مدیر تالار
تعیین یک یا چند متغیر، به عنوان ورودی های دلخواه تابع هنگام تعریف تابع با دستور function در متلب

تعیین یک یا چند متغیر، به عنوان ورودی های دلخواه تابع هنگام تعریف تابع با دستور function در متلب

تعیین یک یا چند متغیر، به عنوان ورودی های دلخواه تابع
(کاربر به دلخواه، می تواند آنها را به عنوان ورودی، به تابع بدهد یا خیر)،
هنگام تعریف تابع با دستور function در متلب :


قبلا در مبحثی دیگر، چگونگی تعریف یک تابع جدید در متلب را شرح دادیم (با استفاده از دستور function). اکنون می خواهیم شرح بدهیم که چگونه می توان یک یا چند متغیر را به عنوان ورودی دلخواه برای تابع تعیین کرد. منظور از ورودی دلخواه این است که هنگام استفاده از تابع، می توانیم انتخاب کنیم که آن ورودی را به تابع بدهیم یا نه و البته نحوه اجرای تابع، در این دو حالت نیز متفاوت خواهد بود.برای شرح چگونگی تعریف یک یا چند ورودی، به عنوان ورودی های دلخواه برای تابع، به مثال زیر توجه کنید :

مثال :
من ابتدا تابعی را به صورت عادی و با 4 متغیر به عنوان ورودی تعریف می کنم که دو تا از آن 4 ورودی، در تابع استفاده نمی شوند، زیرا می خواهم نکاتی را به شما نشان بدهم :
کد:
[LEFT][COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#0000FF]function[/COLOR] [COLOR=#008800][[/COLOR]E[COLOR=#008800]][/COLOR] = addFunction[COLOR=#008800]([/COLOR]A,B,C,D[COLOR=#008800])[/COLOR]
E=A+B;[/FONT]
[/FONT][/COLOR][/LEFT]
چون نام تابع را برابر addFunction انتخاب کرده ایم، بنابراین باید کد بالا در یک m-file با نام addFunction ذخیره شود (یعنی فایل addFunction.m). همچنین فایل مورد نظر، باید در مسیر های (path) تعریف شده در متلب قرار داشته باشد یا مسیر آن را به مسیرهای متلب اضافه کنیم.پس با فرض تعریف تابع به صورت بالا، کد زیر را اجرا می کنیم :
کد:
[LEFT]
[COLOR=#000000][FONT=Tahoma][FONT=monospace]addFunction[COLOR=#008800]([/COLOR][COLOR=#3333FF]1[/COLOR],[COLOR=#3333FF]2[/COLOR],[COLOR=#3333FF]3[/COLOR][COLOR=#008800])[/COLOR][/FONT]
[/FONT][/COLOR][/LEFT]
نتیجه :


کد:
[LEFT]
[COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#0000FF]ans[/COLOR] =

     [COLOR=#3333FF]3[/COLOR][/FONT]
[/FONT][/COLOR][/LEFT]
اکنون کد زیر را اجرا می کنیم :
کد:
[LEFT]
[COLOR=#000000][FONT=Tahoma][FONT=monospace]addFunction[COLOR=#008800]([/COLOR][COLOR=#3333FF]1[/COLOR],[COLOR=#3333FF]2[/COLOR][COLOR=#008800])[/COLOR][/FONT]
[/FONT][/COLOR][/LEFT]
نتیجه :


کد:
[LEFT]
[COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#0000FF]ans[/COLOR] =

     [COLOR=#3333FF]3[/COLOR][/FONT]
[/FONT][/COLOR]
[/LEFT]
پس مشاهده می کنید، اگر در کدهای تابع، کدهایی بر اساس یک یا چند ورودی وجود نداشته باشد، عدم تعریف آنها به صورت ورودی تابع، اختلالی در اجرای کدهای تابع ایجاد نمی کند و تنها باید به ترتیب متغیرهای ورودی توجه کرد که مثلا چون دو ورودی را به عنوان ورودی های تابع تعیین کرده ایم، بنابراین تابع آن دو را به عنوان دو ورودی اول تعریف شده (یعنی A و B ) در نظر می گیرد.بنابراین ما باید کدهای تابع را به گونه ای بنویسیم که اگر متغیرهای C و D (که می خواهیم ورودی دلخواه باشند)، تعیین شده بودند، یک سری کد و اگر تعیین نشده بودند، یک سری کد دیگر اجرا گردد. برای این منظور، از تابع exist استفاده می کنیم که می تواند برای تشخیص تعریف شدن یا تعریف نشدن یک متغیر به کار رود.بنابراین این بار، کدهای تابع را به صورت زیر می نویسیم :
کد:
[LEFT]
[COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#0000FF]function[/COLOR] [COLOR=#008800][[/COLOR]E[COLOR=#008800]][/COLOR] = addFunction[COLOR=#008800]([/COLOR]A,B,C,D[COLOR=#008800])[/COLOR]
E=A+B;
[COLOR=#0000FF]if[/COLOR][COLOR=#008800]([/COLOR][COLOR=#0000FF]exist[/COLOR][COLOR=#008800]([/COLOR][COLOR=#A020F0]'D'[/COLOR][COLOR=#008800])[/COLOR][COLOR=#008800])[/COLOR] [COLOR=#228B22]% C and D are defined[/COLOR]
    E=A+B+C+D;
[COLOR=#0000FF]elseif[/COLOR][COLOR=#008800]([/COLOR][COLOR=#0000FF]exist[/COLOR][COLOR=#008800]([/COLOR][COLOR=#A020F0]'C'[/COLOR][COLOR=#008800])[/COLOR][COLOR=#008800])[/COLOR] [COLOR=#228B22]% C is defined[/COLOR]
    E=A+B+C;
[COLOR=#0000FF]else[/COLOR]
    E=A+B;
[COLOR=#0000FF]end[/COLOR][/FONT]
[/FONT][/COLOR][/LEFT]
اکنون چند بار به تابع ارجاع می دهیم. ابتدا هر 4 ورودی را تعیین می کنیم (A و B و C و D) :
کد:
[LEFT]
[COLOR=#000000][FONT=Tahoma][FONT=monospace]addFunction[COLOR=#008800]([/COLOR][COLOR=#3333FF]1[/COLOR],[COLOR=#3333FF]2[/COLOR],[COLOR=#3333FF]3[/COLOR],[COLOR=#3333FF]4[/COLOR][COLOR=#008800])[/COLOR][/FONT]
[/FONT][/COLOR][/LEFT]
نتیجه :


کد:
[LEFT]
[COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#0000FF]ans[/COLOR] =

    [COLOR=#3333FF]10[/COLOR][/FONT]
[/FONT][/COLOR][/LEFT]
این بار تنها 3 ورودی را تعیین می کنیم (A و B و C) :
کد:
[LEFT]
[COLOR=#000000][FONT=Tahoma][FONT=monospace]addFunction[COLOR=#008800]([/COLOR][COLOR=#3333FF]1[/COLOR],[COLOR=#3333FF]2[/COLOR],[COLOR=#3333FF]3[/COLOR][COLOR=#008800])[/COLOR][/FONT]
[/FONT][/COLOR][/LEFT]
نتیجه :


کد:
[LEFT]
[COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#0000FF]ans[/COLOR] =

     [COLOR=#3333FF]6[/COLOR][/FONT]
[/FONT][/COLOR][/LEFT]
و در آخر، تنها دو ورودی را تعیین می کنیم (A و B):
کد:
[LEFT]
[COLOR=#000000][FONT=Tahoma][FONT=monospace]addFunction[COLOR=#008800]([/COLOR][COLOR=#3333FF]1[/COLOR],[COLOR=#3333FF]2[/COLOR][COLOR=#008800])[/COLOR][/FONT]
[/FONT][/COLOR][/LEFT]
نتیجه :


کد:
[LEFT]
[COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#0000FF]ans[/COLOR] =

     [COLOR=#3333FF]3[/COLOR][/FONT]
[COLOR=#3333FF]
[/COLOR]
[/FONT][/COLOR][/LEFT]
 

P O U R I A

مدیر مهندسی شیمی مدیر تالار گفتگوی آزاد
مدیر تالار
شیوه های به کار بردن توابع داخلی متلب

شیوه های به کار بردن توابع داخلی متلب

در متلب، دو شیوه برای استفاده از توابع داخلی آن وجود دارد. به عنوان مثال، دستور hold را در نظر بگیرید. این دستور را به دو شیوه زیر می توانیم به کار ببریم :

شیوه اول :

در این شیوه، در مقابل hold ، یک پرانتز را باز کرده و مشخصه ای را که برای آن در نظر گرفته ایم، در میان دو علامت ' قرار می دهیم (به صورت یک رشته) :
کد:
[LEFT][COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#0000FF]hold[/COLOR][COLOR=#008800]([/COLOR][COLOR=#A020F0]'on'[/COLOR][COLOR=#008800])[/COLOR][/FONT]
[/FONT][/COLOR][/LEFT]
شیوه دوم :

در این شیوه، ابتدا کلمه hold را می نویسیم و سپس یک فاصله قرار می دهیم و در آخر، مشخصه مورد نظرمان را که on می باشد، می نویسیم :
کد:
[LEFT]
[COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#0000FF]hold[/COLOR] on[/FONT]
[/FONT][/COLOR][/LEFT]
در این شیوه، از علامت ' استفاده نمی کنیم و خود متلب، به طور خودکار، کلمه on را به صورت ((رشته)) به ورودی تابع hold می دهد.
 

P O U R I A

مدیر مهندسی شیمی مدیر تالار گفتگوی آزاد
مدیر تالار
مشاهده کدهای توابع متلب با دستور type

مشاهده کدهای توابع متلب با دستور type

در متلب، توابع بسیاری وجود دارد که هر کدام، در واقع یک برنامه می باشند که یک یا چند ورودی را دریافت می کنند و یک یا چند خروجی را بر می گردانند. ممکن است نیاز داشته باشیم که کدهای نوشته شده برای یک تابع در متلب را مشاهده کنیم. امکان مشاهده کدهای برخی از توابع داخلی متلب وجود ندارد، اما چنانچه این امکان برای یک تابع متلب فعال باشد، باید از دستور type استفاده کنیم. به مثال زیر توجه کنید :

مثال :
به عنوان مثال، تابع graphminspantree در متلب، برای حل مسئله minimal spanning tree در یک گراف به کار می رود. چنانچه فردی بخواهد کدهای نوشته شده برای این تابع را مشاهده کند، باید دستور زیر را اجرا کند :
کد:
[LEFT][COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#0000FF]type[/COLOR] graphminspantree[/FONT]
[/FONT][/COLOR][/LEFT]
نتیجه :


کد:
[LEFT]
[COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#0000FF]function[/COLOR] [COLOR=#008800][[/COLOR]T,pred[COLOR=#008800]][/COLOR] = graphminspantree[COLOR=#008800]([/COLOR]G,[COLOR=#0000FF]varargin[/COLOR][COLOR=#008800])[/COLOR]
[COLOR=#228B22]%GRAPHMINSPANTREE finds the minimal spanning tree in graph.[/COLOR]
[COLOR=#228B22]% [/COLOR]
[COLOR=#228B22]% [T, PRED] = GRAPHMINSPANTREE(G) finds an acyclic subset of edges that[/COLOR]
[COLOR=#228B22]% connects all the nodes in the undirected graph G and for which the total[/COLOR]
[COLOR=#228B22]% weight is minimized. Weights of the edges are all nonzero entries in the[/COLOR]
[COLOR=#228B22]% lower triangle of the n-by-n sparse matrix G. T is a spanning tree[/COLOR]
[COLOR=#228B22]% represented by a sparse matrix. The output PRED contains the predecessor[/COLOR]
[COLOR=#228B22]% nodes of the minimal spanning tree with the root node indicated by a[/COLOR]
[COLOR=#228B22]% zero. The root defaults to the first node in the largest connected[/COLOR]
[COLOR=#228B22]% component, which requires an extra call to the graphconncomp function.[/COLOR]
[COLOR=#228B22]% [/COLOR]
[COLOR=#228B22]% [T, PRED] = GRAPHMINSPANTREE(G,R) sets the root of the minimal spanning[/COLOR]
[COLOR=#228B22]% tree to node R.[/COLOR]
[COLOR=#228B22]%[/COLOR]
[COLOR=#228B22]% GRAPHMINSPANTREE(...,'METHOD',METHOD) selects the algorithm to use,[/COLOR]
[COLOR=#228B22]% options are: [/COLOR]
[COLOR=#228B22]%    ['Prim']     - Prim's algorithm grows the MST one edge at a time by[/COLOR]
[COLOR=#228B22]%                   adding a minimal edge that connects a node in the[/COLOR]
[COLOR=#228B22]%                   growing MST with any other node. Time complexity is[/COLOR]
[COLOR=#228B22]%                   O(e*log(n)). [/COLOR]
[COLOR=#228B22]%    'Kruskal'    - Kruskal's algorithm grows the MST one edge at a time by[/COLOR]
[COLOR=#228B22]%                   finding an edge that connects two trees in a spreading[/COLOR]
[COLOR=#228B22]%                   forest of growing MSTs. Time complexity is[/COLOR]
[COLOR=#228B22]%                   O(e+x*log(n)) where x is the number of edges no longer[/COLOR]
[COLOR=#228B22]%                   than the longest edge in the MST. [/COLOR]
[COLOR=#228B22]% [/COLOR]
[COLOR=#228B22]% Note: n and e are number of nodes and edges respectively.[/COLOR]
[COLOR=#228B22]% [/COLOR]
[COLOR=#228B22]% GRAPHMINSPANTREE(...,'WEIGHTS',W) provides custom weights for the edges,[/COLOR]
[COLOR=#228B22]% useful to indicate zero valued weights. W is a column vector with one[/COLOR]
[COLOR=#228B22]% entry for every edge in G, traversed column-wise.[/COLOR]
[COLOR=#228B22]% [/COLOR]
[COLOR=#228B22]% Remarks: When the graph is unconnected, Prim's algorithm only returns the[/COLOR]
[COLOR=#228B22]% tree that contains R, while Kruskal's algorithm returns an MST for every[/COLOR]
[COLOR=#228B22]% component. [/COLOR]
[COLOR=#228B22]% [/COLOR]
[COLOR=#228B22]% Example:[/COLOR]
[COLOR=#228B22]%   % Create an undirected graph with 6 nodes[/COLOR]
[COLOR=#228B22]%   W = [.41 .29 .51 .32 .50 .45 .38 .32 .36 .29 .21];[/COLOR]
[COLOR=#228B22]%   DG = sparse([1 1 2 2 3 4 4 5 5 6 6],[2 6 3 5 4 1 6 3 4 2 5],W)[/COLOR]
[COLOR=#228B22]%   UG = tril(DG + DG')[/COLOR]
[COLOR=#228B22]%   view(biograph(UG,[],'ShowArrows','off','ShowWeights','on'))[/COLOR]
[COLOR=#228B22]%   % Find the minimum spanning tree of UG[/COLOR]
[COLOR=#228B22]%   [ST,pred] = graphminspantree(UG)[/COLOR]
[COLOR=#228B22]%   view(biograph(ST,[],'ShowArrows','off','ShowWeights','on'))[/COLOR]
[COLOR=#228B22]%[/COLOR]
[COLOR=#228B22]% See also: GRAPHALLSHORTESTPATHS, GRAPHCONNCOMP, GRAPHISDAG,[/COLOR]
[COLOR=#228B22]% GRAPHISOMORPHISM, GRAPHISSPANTREE, GRAPHMAXFLOW, GRAPHPRED2PATH,[/COLOR]
[COLOR=#228B22]% GRAPHSHORTESTPATH, GRAPHTHEORYDEMO, GRAPHTOPOORDER, GRAPHTRAVERSE.[/COLOR]
[COLOR=#228B22]%[/COLOR]
[COLOR=#228B22]% References: [/COLOR]
[COLOR=#228B22]%  [1]  J. B. Kruskal. "On the shortest spanning subtree of a graph and the[/COLOR]
[COLOR=#228B22]%       traveling salesman problem" In Proceedings of the American[/COLOR]
[COLOR=#228B22]%       Mathematical Society, 7:48-50, 1956. [/COLOR]
[COLOR=#228B22]%  [2]  R. Prim. "Shortest connection networks and some generalizations"[/COLOR]
[COLOR=#228B22]%       Bell System Technical Journal, 36:1389-1401, 1957.[/COLOR]
 
[COLOR=#228B22]%   Copyright 2006-2008 The MathWorks, Inc.[/COLOR]
[COLOR=#228B22]%   [FONT=MathJax_Math][I]R[/I][/FONT][FONT=MathJax_Math][I]e[/I][/FONT][FONT=MathJax_Math][I]v[/I][/FONT][FONT=MathJax_Math][I]i[/I][/FONT][FONT=MathJax_Math][I]s[/I][/FONT][FONT=MathJax_Math][I]i[/I][/FONT][FONT=MathJax_Math][I]o[/I][/FONT][FONT=MathJax_Math][I]n[/I][/FONT][FONT=MathJax_Main]:[/FONT][FONT=MathJax_Main]1.1.6.7[/FONT]  [FONT=MathJax_Math][I]D[/I][/FONT][FONT=MathJax_Math][I]a[/I][/FONT][FONT=MathJax_Math][I]t[/I][/FONT][FONT=MathJax_Math][I]e[/I][/FONT][FONT=MathJax_Main]:[/FONT][FONT=MathJax_Main]2010[/FONT][FONT=MathJax_Main]/[/FONT][FONT=MathJax_Main]09[/FONT][FONT=MathJax_Main]/[/FONT][FONT=MathJax_Main]02[/FONT][FONT=MathJax_Main]13[/FONT][FONT=MathJax_Main]:[/FONT][FONT=MathJax_Main]28[/FONT][FONT=MathJax_Main]:[/FONT][FONT=MathJax_Main]55[/FONT][/COLOR]
 
algorithms = [COLOR=#008800]{[/COLOR][COLOR=#A020F0]'prim'[/COLOR],[COLOR=#A020F0]'kruskal'[/COLOR][COLOR=#008800]}[/COLOR];
algorithmkeys = [COLOR=#008800]{[/COLOR][COLOR=#A020F0]'pri'[/COLOR],[COLOR=#A020F0]'kru'[/COLOR][COLOR=#008800]}[/COLOR];
debug_level = [COLOR=#3333FF]0[/COLOR];
 
[COLOR=#228B22]% set defaults of optional input arguments[/COLOR]
W = [COLOR=#008800][[/COLOR][COLOR=#008800]][/COLOR]; [COLOR=#228B22]% no custom weights[/COLOR]
R = [COLOR=#008800][[/COLOR][COLOR=#008800]][/COLOR]; [COLOR=#228B22]% no root given[/COLOR]
algorithm  = [COLOR=#3333FF]1[/COLOR]; [COLOR=#228B22]% defaults to prim[/COLOR]
 
[COLOR=#228B22]% find out signature of input arguments[/COLOR]
[COLOR=#0000FF]if[/COLOR] nargin>[COLOR=#3333FF]1[/COLOR] && isnumeric[COLOR=#008800]([/COLOR][COLOR=#0000FF]varargin[/COLOR][COLOR=#008800]{[/COLOR][COLOR=#3333FF]1[/COLOR][COLOR=#008800]}[/COLOR][COLOR=#008800])[/COLOR]
    R = [COLOR=#0000FF]varargin[/COLOR][COLOR=#008800]{[/COLOR][COLOR=#3333FF]1[/COLOR][COLOR=#008800]}[/COLOR];
    [COLOR=#0000FF]varargin[/COLOR][COLOR=#008800]([/COLOR][COLOR=#3333FF]1[/COLOR][COLOR=#008800])[/COLOR] = [COLOR=#008800][[/COLOR][COLOR=#008800]][/COLOR];
[COLOR=#0000FF]end[/COLOR]
 
[COLOR=#228B22]% read in optional PV input arguments[/COLOR]
nvarargin = numel[COLOR=#008800]([/COLOR][COLOR=#0000FF]varargin[/COLOR][COLOR=#008800])[/COLOR];
[COLOR=#0000FF]if[/COLOR] nvarargin
    [COLOR=#0000FF]if[/COLOR] [COLOR=#0000FF]rem[/COLOR][COLOR=#008800]([/COLOR]nvarargin,[COLOR=#3333FF]2[/COLOR][COLOR=#008800])[/COLOR] == [COLOR=#3333FF]1[/COLOR]
        [COLOR=#0000FF]error[/COLOR][COLOR=#008800]([/COLOR][COLOR=#A020F0]'Bioinfo:graphminspantree:IncorrectNumberOfArguments'[/COLOR],[COLOR=#008800]...[/COLOR]
            [COLOR=#A020F0]'Incorrect number of arguments to %s.'[/COLOR],mfilename[COLOR=#008800])[/COLOR];
    [COLOR=#0000FF]end[/COLOR]
    okargs = [COLOR=#008800]{[/COLOR][COLOR=#A020F0]'method'[/COLOR],[COLOR=#A020F0]'weights'[/COLOR][COLOR=#008800]}[/COLOR];
    [COLOR=#0000FF]for[/COLOR] [COLOR=#0000FF][COLOR=#3333FF]j[/COLOR][/COLOR]=[COLOR=#3333FF]1[/COLOR]:[COLOR=#3333FF]2[/COLOR]:nvarargin-[COLOR=#3333FF]1[/COLOR]
        pname = [COLOR=#0000FF]varargin[/COLOR][COLOR=#008800]{[/COLOR][COLOR=#0000FF][COLOR=#3333FF]j[/COLOR][/COLOR][COLOR=#008800]}[/COLOR];
        pval = [COLOR=#0000FF]varargin[/COLOR][COLOR=#008800]{[/COLOR][COLOR=#0000FF][COLOR=#3333FF]j[/COLOR][/COLOR]+[COLOR=#3333FF]1[/COLOR][COLOR=#008800]}[/COLOR];
        k = [COLOR=#0000FF]find[/COLOR][COLOR=#008800]([/COLOR]strncmpi[COLOR=#008800]([/COLOR]pname,okargs,numel[COLOR=#008800]([/COLOR]pname[COLOR=#008800])[/COLOR][COLOR=#008800])[/COLOR][COLOR=#008800])[/COLOR];
        [COLOR=#0000FF]if[/COLOR] isempty[COLOR=#008800]([/COLOR]k[COLOR=#008800])[/COLOR]
            [COLOR=#0000FF]error[/COLOR][COLOR=#008800]([/COLOR][COLOR=#A020F0]'Bioinfo:graphminspantree:UnknownParameterName'[/COLOR],[COLOR=#008800]...[/COLOR]
                [COLOR=#A020F0]'Unknown parameter name: %s.'[/COLOR],pname[COLOR=#008800])[/COLOR];
        [COLOR=#0000FF]elseif[/COLOR] [COLOR=#0000FF]length[/COLOR][COLOR=#008800]([/COLOR]k[COLOR=#008800])[/COLOR]>[COLOR=#3333FF]1[/COLOR]
            [COLOR=#0000FF]error[/COLOR][COLOR=#008800]([/COLOR][COLOR=#A020F0]'Bioinfo:graphminspantree:AmbiguousParameterName'[/COLOR],[COLOR=#008800]...[/COLOR]
                [COLOR=#A020F0]'Ambiguous parameter name: %s.'[/COLOR],pname[COLOR=#008800])[/COLOR];
        [COLOR=#0000FF]else[/COLOR]
            [COLOR=#0000FF]switch[/COLOR][COLOR=#008800]([/COLOR]k[COLOR=#008800])[/COLOR]
                [COLOR=#0000FF]case[/COLOR] [COLOR=#3333FF]1[/COLOR] [COLOR=#228B22]% 'method'[/COLOR]
                    algorithm = [COLOR=#0000FF]find[/COLOR][COLOR=#008800]([/COLOR]strncmpi[COLOR=#008800]([/COLOR]pval,algorithms,numel[COLOR=#008800]([/COLOR]pval[COLOR=#008800])[/COLOR][COLOR=#008800])[/COLOR][COLOR=#008800])[/COLOR]; 
                    [COLOR=#0000FF]if[/COLOR] isempty[COLOR=#008800]([/COLOR]algorithm[COLOR=#008800])[/COLOR] 
                        [COLOR=#0000FF]error[/COLOR][COLOR=#008800]([/COLOR][COLOR=#A020F0]'Bioinfo:graphminspantree:NotValidMethod'[/COLOR],[COLOR=#008800]...[/COLOR]
                              [COLOR=#A020F0]'String "%s" is not a valid algorithm.'[/COLOR],pval[COLOR=#008800])[/COLOR]
                    [COLOR=#0000FF]elseif[/COLOR] numel[COLOR=#008800]([/COLOR]algorithm[COLOR=#008800])[/COLOR]>[COLOR=#3333FF]1[/COLOR]
                         [COLOR=#0000FF]error[/COLOR][COLOR=#008800]([/COLOR][COLOR=#A020F0]'Bioinfo:graphminspantree:AmbiguousMethod'[/COLOR],[COLOR=#008800]...[/COLOR]
                              [COLOR=#A020F0]'String "%s" is ambiguous.'[/COLOR],pval[COLOR=#008800])[/COLOR]
                    [COLOR=#0000FF]end[/COLOR]
                [COLOR=#0000FF]case[/COLOR] [COLOR=#3333FF]2[/COLOR] [COLOR=#228B22]% 'weights'[/COLOR]
                    W = pval[COLOR=#008800]([/COLOR]:[COLOR=#008800])[/COLOR];
            [COLOR=#0000FF]end[/COLOR]
        [COLOR=#0000FF]end[/COLOR]
    [COLOR=#0000FF]end[/COLOR]
[COLOR=#0000FF]end[/COLOR]
 
[COLOR=#228B22]% find manually the best root (if it was not given)[/COLOR]
[COLOR=#0000FF]if[/COLOR] isempty[COLOR=#008800]([/COLOR]R[COLOR=#008800])[/COLOR]
    [COLOR=#008800][[/COLOR]num_comp,classes[COLOR=#008800]][/COLOR] = graphconncomp[COLOR=#008800]([/COLOR]G,[COLOR=#A020F0]'directed'[/COLOR],false[COLOR=#008800])[/COLOR];
    [COLOR=#0000FF]if[/COLOR] num_comp==[COLOR=#3333FF]1[/COLOR]
        R = [COLOR=#3333FF]1[/COLOR];
    [COLOR=#0000FF]else[/COLOR]
        R = [COLOR=#0000FF]find[/COLOR][COLOR=#008800]([/COLOR]classes==mode[COLOR=#008800]([/COLOR]classes[COLOR=#008800])[/COLOR],[COLOR=#3333FF]1[/COLOR],[COLOR=#A020F0]'first'[/COLOR][COLOR=#008800])[/COLOR];
    [COLOR=#0000FF]end[/COLOR]
[COLOR=#0000FF]end[/COLOR]
 
[COLOR=#228B22]% call the mex implementation of the graph algorithms[/COLOR]
[COLOR=#0000FF]if[/COLOR] nargout>[COLOR=#3333FF]1[/COLOR]
    [COLOR=#0000FF]if[/COLOR] isempty[COLOR=#008800]([/COLOR]W[COLOR=#008800])[/COLOR]
        [COLOR=#008800][[/COLOR]T,pred[COLOR=#008800]][/COLOR] = graphalgs[COLOR=#008800]([/COLOR]algorithmkeys[COLOR=#008800]{[/COLOR]algorithm[COLOR=#008800]}[/COLOR],debug_level,false,G,R[COLOR=#008800])[/COLOR];
    [COLOR=#0000FF]else[/COLOR]
        [COLOR=#008800][[/COLOR]T,pred[COLOR=#008800]][/COLOR] = graphalgs[COLOR=#008800]([/COLOR]algorithmkeys[COLOR=#008800]{[/COLOR]algorithm[COLOR=#008800]}[/COLOR],debug_level,false,G,R,W[COLOR=#008800])[/COLOR];
    [COLOR=#0000FF]end[/COLOR]    
[COLOR=#0000FF]else[/COLOR]
    [COLOR=#0000FF]if[/COLOR] isempty[COLOR=#008800]([/COLOR]W[COLOR=#008800])[/COLOR]
        T = graphalgs[COLOR=#008800]([/COLOR]algorithmkeys[COLOR=#008800]{[/COLOR]algorithm[COLOR=#008800]}[/COLOR],debug_level,false,G,R[COLOR=#008800])[/COLOR];
    [COLOR=#0000FF]else[/COLOR]
        T = graphalgs[COLOR=#008800]([/COLOR]algorithmkeys[COLOR=#008800]{[/COLOR]algorithm[COLOR=#008800]}[/COLOR],debug_level,false,G,R,W[COLOR=#008800])[/COLOR];
    [COLOR=#0000FF]end[/COLOR] 
[COLOR=#0000FF]end[/COLOR][/FONT]
[/FONT][/COLOR][/LEFT]
مشاهده می کنید که در ابتدای برنامه نیز توضیحاتی نوشته شده است تا به راحتی بتوانید به نحوه عملکرد تابع و کدهای نوشته شده برای آن پی ببرید.
 

P O U R I A

مدیر مهندسی شیمی مدیر تالار گفتگوی آزاد
مدیر تالار
تشخیص تعداد ورودی های یک تابع با دستور nargin

تشخیص تعداد ورودی های یک تابع با دستور nargin

با دستور nargin در متلب، می توان تعداد ورودی های توابع تعریف شده در متلب را مشخص کرد. هنگام استفاده از دستور nargin ، حتما باید نام تابع در بین دو علامت ' نوشته شود. به مثال زیر توجه کنید :

مثال :
فرض کنید بخواهیم بدانیم که تعداد ورودی های تابع cos که در متلب تعریف شده است، چند تا می باشد. برای این منظور کد زیر را می نویسیم :
کد:
[LEFT][COLOR=#000000][FONT=Tahoma][FONT=monospace]A=[COLOR=#0000FF]nargin[/COLOR][COLOR=#008800]([/COLOR][COLOR=#A020F0]'cos'[/COLOR][COLOR=#008800])[/COLOR][/FONT]
[/FONT][/COLOR][/LEFT]
نتیجه :


کد:
[LEFT]
[COLOR=#000000][FONT=Tahoma][FONT=monospace]A =
 
     [COLOR=#3333FF]1[/COLOR][/FONT]
[/FONT][/COLOR][/LEFT]
بنابراین دستور cos در متلب، تنها یک مقدار را به عنوان ورودی دریافت می کند.
 

P O U R I A

مدیر مهندسی شیمی مدیر تالار گفتگوی آزاد
مدیر تالار
تشخیص تعداد خروجی های یک تابع با دستور nargout

تشخیص تعداد خروجی های یک تابع با دستور nargout

با استفاده از دستور nargout در متلب، می توانیم تعداد خروجی های توابع تعریف شده در متلب را مشخص کنیم. زمانی که از دستور nargout ، برای تشخیص تعداد خروجی های یک تابع استفاده می کنیم، حتما باید نام آن تابع را در بین دو علامت ' بنویسیم. به مثال زیر توجه کنید :

مثال :
تعداد خروجی های تابع cos که در متلب تعریف شده است را تعیین می کنیم :
کد:
[LEFT][COLOR=#000000][FONT=Tahoma][FONT=monospace]A=[COLOR=#0000FF]nargout[/COLOR][COLOR=#008800]([/COLOR][COLOR=#A020F0]'cos'[/COLOR][COLOR=#008800])[/COLOR][/FONT]
[/FONT][/COLOR][/LEFT]
نتیجه :


کد:
[LEFT]
[COLOR=#000000][FONT=Tahoma][FONT=monospace]A =
 
     [COLOR=#3333FF]1[/COLOR][/FONT]
[/FONT][/COLOR][/LEFT]
بنابراین تابع cos ، تنها یک خروجی دارد.
 
بالا