MatlabTips
891 subscribers
462 photos
73 videos
54 files
304 links
آموزش MATLAB با "استفاده از ویدئو و متن" در سطوح مبتدی تا پیشرفته
پاسخ به سوالات تخصصی:
@roholazandie
Download Telegram
رویه ای که تصویر بر آن گسترش یافته
تصویر
🔵سلسله مراتب هندل آبجکت های گرافیکی🔵
سطح پیچیدگی:🌕🌑🌑🌑🌑
پیش‌نیاز: آشنایی با گرافیک در متلب
برای: علاقه مندان به مفهوم گرافیک
📝هدف از این پست : شما در این پست و پست های بعدی مفهوم هندل گرافیکی و اشیا گرافیکی را به صورت کامل خواهید آموخت.

در متلب تمام پنجره ها(figure) فرزندان(children) آبجکت ریشه(root) هستند. root همان پنجره مادر یا کلاینت یا متلب می باشد.
هر پنجره می تواند دارای فرزندانی چون axes، نمودارها و واسط های کاربری مختلف باشد. اشیا واسط کاربری(دکمه ها، اسلایدرها، چک باکس ها و ...) به کاربر اجازه میدهند تا اجرای یک برنامه را از طریق Callbackهایی کنترل کند. اشیا axes نمودارهای گرافیکی را نمایش میدهد و خود میتواند دارای فرزندانی باشد.
اشیا گرافیکی هم برای نمایش مورد استفاده قرار میگیرند و هم میتوانند به ورودی هایی مثل کلیک موس و دکمه عکس العمل نشان دهند.
جدول زیر نمایی از سلسله مراتب این اشیا را نشان می دهد. هر یک از این اشیا لیست بلند بالایی از ویژگی هایی که ظاهر انها را تنظیم میکند دارند. برای اطلاعات بیشتر می تواند در اینترنت عباراتی مثل "lineseries properties" یا "image properties" جستجو کنید.
در پست بعد در مورد تفاوت axis و axes و مفهوم عمیق تر هندل ها صحبت خواهیم کرد.
با ما باشید.
#Handle, #Graphics
@MatlabTips
جدول سلسله مراتب آبجکت های گرافیکی در متلب
🔵هندلroot🔵
سطح پیچیدگی:🌕🌑🌑🌑🌑
پیش‌نیاز: آشنایی با گرافیک در متلب
برای: علاقه مندان به مفهوم گرافیک
📝هدف از این پست : اطلاعاتی در مورد هندل root


قدرت مانور در بخش گرافیک متلب احتمالا به دلیل هندل اشیا گرافیکی است. (یک فصل از ویدئوی آموزشی که بسیار حرفه ای است به همین بخش اختصاص داده شده است)، ما در اینجا به اختصار به این مفاهیم میپردازیم.
هندل های گرافیکی عناصر پایه ای در گرافیک متلب هستند. این آبجکت ها براساس یک ساختار والد-فرزندی آرایش داده شده اند. برای مثال آبجکت های line و text فرزندان آبجکت Axes هستند. توجه به سلسله مراتب والد-فرزندی ، الی الخصوص هنگامی که میخواهدی آبجکت های گرافکی را با استفاده از هندلشان دستکاری کنید، اهمیت دارد.
1⃣هر موقع که متلب یک آبجکت گرافیکی میسازد، بصورت خودکار هندل آن نیز ایجاد میشود.
2⃣خود هندل بصورت floating-point نمایش داده میشود، اما این مسئله ای نیست که ما به آن اهمیت دهیم. چیزی که مهم تر است ذخیره هندل و سپس استفاده از هندل برای تغییر و دستکاری آبجکت گرافیکی مورد نظر است.
3⃣آبجکت root تنها آبجکتی است که هندلش 0 است. تنها یک آبجکت root وجود دارد که در هنگام stratup متلب ساخته میشود. تمام آبجکت های دیگر زیر root قرار میگیرند(به تصویر بالا دقت کنید)
#Handle, #Graphics , #Root, #For_all
@MatlabTips
🔵استفاده از تابع cellfun🔵
سطح پیچیدگی:🌕🌕🌑🌑🌑
پیش‌نیاز:(کد نویسی متوسط)
برای:(متوسط و پیشرفته)

گاهی اوقات نیاز داریم که یک تابع را بر روی تعدادی شی مختلف اعمال کنیم. برای این کار می توان از تابع cellfun استفاده کرد. در این تابع می توان تابع های متلب یا تابع های از پیش تعریف شده کاربر را بر روی یک cell اعمال کرد.بله درست خواندید: این تابع به صورت ورودی تابع می پذیرد. به طور مثال لیست زیر را در نظر بگیرید:

greetings = {'Hello','Guten Tag','Sawadee','Bonjour','Namaste',''}


میخواهیم طول هر کدام را حساب کنیم. برای این کار می توان به صورت زیر عمل کرد:

>> cellfun('size',greetings,2)
>> cellfun('length',greetings)

ans =
5 9 7 7 7 0


حالا فرض کنید که من چند ماتریس با اندازه های مختلف در یک سل قرار داده ام به صورت زیر:

>> A = {magic(3) eye(3) rand(4,3)}

A =
[3x3 double] [3x3 double] [4x3 double]


و می خواهم ترانهاده همه آن ها را محاسبه کرده و در یک سل جدید قرار دهم:

>> Btrans = cellfun(@transpose,A,'UniformOutput',false)

Btrans =
[3x3 double] [3x3 double] [3x4 double]


آرگومان UniformOutput به صورت پیش فرض true است بنابراین برای اینکه خروجی را به صورت یک سل جدید داشته باشم باید آن را به false تغییر دهم. اما شاید جالب ترین کاربرد آن هنگامی است که ما با استفاده از توابع بی نام یا توابع لمبدا (lambda function) عملیات مورد نظرمان را بر روی داده ها انجام میدهیم. مثلا من می خواهم جمع تمام اعضای هر کدام از آرایه ها را به صورت جدا حساب کنم. برای این منظور به صورت زیر این کار را انجام می دهم:
>> Bsum = cellfun(@(x) sum(sum(x)),A)

Bsum =
45.0000 3.0000 7.3668


در قطعه کد بالا از تابعی تعریف شده که با @ مشخص گردیده و این بدان معنی است که این تابع بدون نام است (نام آن مهم نیست) و ورودی X را می گیرد و خروجی sum(sum(x)) را تولید می کند. توابع دیگری هم وجود دارند که ارتباط نزدیکی با cellfun دارند که در قسمت‌های بعدی به آن‌ها می پردازیم.

@MatlabTips
#For_intermediate, #For_Advanced
#Cellfun , #Anonymous_Function , #Lambda_Function
to change is human!! lol.
🔵گرفتن هندل🔵
سطح پیچیدگی:🌕🌑🌑🌑🌑
پیش‌نیاز: خواندن دو پست قبلی
برای: علاقه مندان به مفهوم گرافیک
📝هدف از این پست : بدانیم چگونه میتوان یک هندل شی گرافیکی را گرفت و ویژگی های آن را بررسی کنیم.
🎙توجه:🎙 اگر فکر میکنید پست های مربوط به گرافیک بیهوده است به جرات میتوانم بگویم که نرم افزار متلب را درک نکرده اید و بهتر است مطالعتتان را بیشتر کنید.

توابعی که برای رسم آبجکت‌های گرافیکی استفاده می شوند(مثل plot,figure,...) می توان به نحوی از آنها استفاده کرد که هندلشان را بگیریم.
x = 0:pi/20:2*pi;

hsin = plot(x, sin(x))

hold on

hx = xlabel(’x’)

متغیر hsin هندل آبجکت گراف سینوس است و hx هندل آبجکت تکست. دقت کنید که مقدار این دو هندل از نوع اعشاری است.
1⃣هندل hsin را در یک متغیر ذخیره کنید(hsin_new). حالا متغیر hsin را پاک کنید و مقدار hsin_new را ببینید. تعجب نکنید که hsin_new هیچ مقداری ندارد، چون مادرش از بین رفته است. این نوع ادیس دهی، اندیس دهی با رفرنس است( که هندل های گرافیکی از این دسته هستند). یعنی اگر رفرنس پاک شود، باقی نیز پاک میشوند.
2⃣اگر پنجره گرافیک را ببندیم دیگر hsin و hx هم در کار نخواهدبود. به عبارتی تا زمانی این ها اعتبار دارند که شی گرافیکی وجود داشته باشد.
این آبجکت ها به فراخور نوع عملی که انجام میدهند یک سری ویژگی هم دارند. که اگر بخواهیم آن ها را لیست کنیم از دستور get استفاده میکنیم. برای مثال:
get(hsin)

get(hx)

#For_all , #Graphics
@MatlabTips
🖕🖕🖕🖕
آهنربای شناوری که با چرخش به تعادل رسیده است برای مدت 3 دقیقه یا بیشتر به پرواز در خواهد آمد. نرخ چرخش آهنربای بالایی باید دقیقا برای این پرواز تنظیم شود، نه زیاد نه کم. همچنین وزن جسم در حال پرواز باید 1 گرم باشد تا بین کشش جاذبه و نیروی دافعه آهنربای پایینی که به صورت یک حلقه بزرگ با بدنه چوبی است، تعادلی برقرار شود.
#fun
@MatlabTips
🔵برنامه نویسی تابعی🔵
سطح پیچیدگی:🌑🌑🌑🌑🌑
پیش‌نیاز:یک ذهن کنجکاو
برای:همه


تغییر دادن پارادایم زبان برنامه نویسی به هیچ وجه کار ساده ای نیست. اما وقتی به آن فکر کنید امکانات بسیار زیادی به روی شما گشوده می شود. به همین دلیل تغییر دادن پارادایم مانند یاد گرفتن یک زبان بیگانه دشوار و همواره با تنبلی ذهنی روبروست.
در این قسمت می خواهیم کمی فراتر از آنچه تاکنون آموخته اید برویم و دید گسترده تری از برنامه نویسی را بر روی شما بگشاییم.
تا کنون برخورد ما با توابع به صورت قطعه کد هایی بود که آن ها را صدا زده و خروجی از آن ها می گرفتیم. ورودی و خروجی های آنها همواره اعداد رشته ها آرایه ماتریس سل و خیلی از چیزهای دیگر بود. اما هرگز تابعی را به تابعی پاس نکرده ایم! توابع همواره شهروندان درجه دوم به حساب می آمدند. اما برای اولین بار کریستوفر استراچی(۱) با ایده گرفتن از حساب لامبدا توابع را به عنوان شهروندان درجه اول به دنیای برنامه نویسی معرفی کرد. شاید اسم برنامه نویسی تابعی یا functoinal programming را شنیده باشید. دراین پارادایم برنامه نویسی توابع تنها شهروندان مجاز هستند به این ترتیب چیزی به نام متغیر یا حالت وجود ندارد! اولین سوالی که ممکن است برای شما پیش آمده باشد این است که: اصلا چه نیازی به این روش برنامه نویسی وجود دارد؟
قبل از همه چیز باید گفت که "محاسبه" به معنای ریاضی آن چیزی جز توابع بازگشتی نیست (یکی از تعاریف بنیادی در کنار ماشین تورینگ) که اولین بار توسط آلونزو چرچ معرفی شد. بنابراین فکر کردن به الگوریتم یا محاسبه به روش برنامه نویسی معمول یا دستوری همانقدر معمولی است که محاسبه به روش تابعی یا اعلانی. پس استفاده از یکی به جای دیگری همان سوال را برای رقیبان ایجاد می کند.
از طرفی محاسبه به روش تابعی در بسیاری از مواقع بسیار ساده تر و خلاصه تر انجام می شود. و این یکی از مزیت های این روش است.
ترتیب محاسبه در روش تابعی مهم نیست! این ویژگی برنامه نویسی تابعی را برای برنامه نویسی همروند و موازی بسیار ایده آل می کند.
حالا سوال دیگری پیش می آید: اگر برنامه نویسی تابعی این همه مزایا دارد چرا بیشتر مورد استفاده قرار نمی گیرد؟
جواب ساده است زیرا تمامی این مزایا خود عیب هم هستند. اولین کاربردهای کامپیوتر های دیجیتال صرفا برای ذخیره و بازیابی اطلاعات بود. این کاربرد با برنامه نویسی تابعی جور در نمی آمد. از طرفی برنامه نویسی تابعی در موارد زیادی منجر به تولید کد های طولانی و دشوار می شود. به این دلایل برنامه نویسی معمول یا دستوری قدرت گرفت و بیشتر کدهای امروز به این صورت نوشته می شود. اما برنامه نویسی تابعی مزایای خوبی دارد که تقریبا تمامی زبان های برنامه سازی امروزه به صورت محدود آن را حمایت می کنند. اکنون تقریبا هیچ زبان برنامه نویسی در یک پارادایم کار نمی کند بلکه ملغمه ای از پارادایم های گوناگون است. زبان های امروز دموکراتیک تر بوده و تمامی مفاهیم(اعداد-رشته ها- ماتریسها و توابع) در آنها شهروندان درجه اول محسوب می شوند. متلب هم از این قاعده مستثنا نیست. در قسمت بعد به معرفی چند کاربرد این نوع برنامه نویسی در متلب اشاره می کنیم. همانطور که گفتیم حمایت متلب از برنامه نویسی تابعی محدود و حتی نسبت به زبان های دیگر هم ساده تر است.
—------------------------------------------------
[1] Burstall, R. (2000). Christopher Strachey—understanding programming languages. Higher-Order and Symbolic Computation, 13(1), 51-55.
@MatlabTips
#Lambda_Function , #Functional_Programming
🔵تغییر ویژگی‌های یک شی گرافیکی🔵
سطح پیچیدگی:🌕🌑🌑🌑🌑
پیش‌نیاز: خواندن پست‌های قبلی مربوط به گرافیک
برای: علاقه مندان به مفهوم گرافیک
📝هدف از این پست : درک set و get

هنگامی که هندل یک شی گرافیکی را گرفتید، می توانید براحتی ویژگی های آن را تغییر دهید. به عنوان یک مثال، یک نمودار سینوسی را رسم کنید و هندل آن را بگیرید:
x = 0:pi/20:2*pi;
hsin = plot(x, sin(x))

ممکن است دوست داشته باشید که نمودارتان قدری ضخیم تر شود. از دستور set استفاده کنید.
set(hsin, ’linewidth’, 4);

ویژگی linewidth تنها یکی از بی شمار ویژگی های شی گرافیکی ماست. برای اینکه تمام این ویژگی ها را ببینیم از دستور get(h) استفاده کنید، که h هندل شی مورد نظر است.
1⃣ شما میتوانید مقدار هر ویژگی را با تابع set تغییر دهید.
set(handle, ‘PropertyName’, PropertyValue)

2⃣اشیا گرافیکی دارای ویژگی های متفاوتی هستند ولی در تعدادی مثل children,parent,type مشترک هستند.

🖊برای تمرین یک نمودار را رسم کرده و هندل آن را در h ذخیره کنید، و با استفاده از دستور get مشخص کنید که parent این هندل کدام است؟
#For_all , #Graphics
@MatlabTips
🔵چگونه متلب را یاد بگیریم🔵

روز به روز این نرم‌افزار در حال گسترش است. شاید کسی که ایده اولیه این نرم‌افزار را داد در مخیله‌اش هم نمیگنجید که روزی اینچنین این نرم‌افزار فراگیر شود تا جایی که طیف زیادی از دانشجویان غیر فنی نیز به این نرم‌افزار گرایش پیدا کرده‌اند.

اما وقتی یک مبتدی نیت میکند که متلب را فرا بگیرد، با انبوهی از آموزش‌های گوناگون (اعم از کتاب، سی دی های آموزشی، فیلم‌های کوتاه، گروه‌هایی در شبکه اجتماعی و ...) روبرو میشود، اضطرابی تمام وجودش را سرشار میکند.

واقعیت این است که دانشجو قبل از اینکه به این حجم از منابع توجه کند، می بایستی هدفش را تعیین کند. برای مثال دانشجوی ترم دوم که در حال پاس کردن ریاضی 2 می باشد، نیازی نیست که کار با جعبه ابزارهای پردازش تصویر را یاد بگیرد و یا اینکه یک کتاب 300 صفحه ای در مورد متلب مطالعه کند. این دانشجو نیاز به یک راه‌انداز(start-up) دارد. چیزی که آن را با محیط متلب آشنا کند و با چندین مثال کاربردی به کاربر بفهماند که با دستورات پایه‌ای هم میتواند گلیم خودش را از آب بکشد.
دانشجویی که در حال اجرای پروژه کارشناسی ارشد است و برای مثال بر روی پردازش تصویر کار میکند، در صورتی که با متلب آشنایی ندارد، نیازی نیست که ساعت‌ها بر روی مقدمات متلب وقت بگذارد، کافی است که اصول اولیه آن را بیاموزد و help خوانی در متلب را یاد بگیرد که همه اینها شاید با 10 ساعت آموزش حل شود و هزینه‌هایی برای کلاس‌های بیرون نکند.

شما به جای اینکه متلب را در کل ببینید باید جزئی بررسی کنید، به عبارتی دیگر کافی است فقط نیازتان را در متلب هایلایت کنید و باقی جاها را تار کنید. خیلی از افراد نیازشان رسم یک رویه سه بعدی است و ممکن است تا آخر عمرشان مثلا به سیمیولینک نیازی پیدا نکنند و بهترین کار این است که وقت صرف قسمتی شود که نیاز شماست.

این کتاب های آموزشی قطور در باب متلب بیشتر جنبه رفرنس یا رساله دارد که با وجود اینترنت کار عبث و بیهوده ای است. شما هم برای یک لیوان شیر، جور یک گاو را نکشید. زمان از طلا هم ارزشمندتر است.
دوستدار شما جبار کمالی
@MatlabTips
🔵توابع بی نام🔵
سطح پیچیدگی:🌕🌕🌑🌑🌑
پیش‌نیاز: برنامه نویسی مقدماتی
برای: متوسط و پیشرفته


همانطور که در قست قبل اشاره کردیم می توان گاهی با توابع به صورت داده ورودی به توابع دیگر استفاده کرد. این مورد شاید برایتان عجیب باشد اما شما بارها این کار را کرده اید. مشتق گرفتن خود یک تابع است که یک ورودی به صورت تابع گرفته و یک خروجی به صورت تابع به شما می دهد. همچنین انتگرال گرفتن(با شرط بر روی مقدار ثابت) تبدیل فوریه، تبدیل لاپلاس، گرادیان ، کرل، دیورژانس امید ریاضی، واریانس، کوواریانس و تقریبا هر اپراتوری که می شناسید این خاصیت را دارد. با این دید استفاده از تابع به عنوان ورودی دیگر برایتان عجیب نخواهد بود.
در متلب برای تعریف کردن یک تابع بی نام و مشخص کردن آن با یک هندل(دسته) با نحو(syntax) ساده ای روبرو هستیم. به طور مثال می توان تابع مجذور را به صورت زیر تعریف و مشخص کرد:

sqr = @(x) x.^2;


در اینجا sqr یک دسته است و اپراتور @ این دسته را برای ما می سازد. پرانتزی که دقیقا بعد از @ می آید ورودی های تابع را مشخص می کند و بعد از آن فرمول جبری تابع قرار می گیرد. مثلا اگر بخواهیم مجذور 5 را محاسبه کنیم کافی است به صورت زیر عمل کنیم:

a = sqr(5)
>>a =
25


برای مثال می توانیم این تابع را به تابع (اپراتور) انتگرال گیری در یک بازه پاس کنیم و نتیجه را ببنییم:

q = integral(sqr,0,1);


توابع بی نام می توانند مقادیر ضرایبشان را هم در خودشان نگه دارند. برای مثال اگر بنویسیم:

a = 1.3;
b = .2;
c = 30;
parabola = @(x) a*x.^2 + b*x + c;


و آنگاه متغیر ها را پاک کنیم و دوباره مقداری به parabola پاس کنیم مقادیر a و b و c همچنان در آن ذخیره شده اند.

clear a b c
x = 1;
y = parabola(x)
y =
31.5000


حتی می توانید تابع را در فایل ذخیره کنید:

save myfile.mat parabola


توابع بی نام می توانند بدون ورودی هم باشند.

t = @() datestr(now);
d = t()
d =
26-Jan-2012 15:11:47


یا اینکه چند ورودی داشته باشند:

myfunction = @(x,y) (x.^2 + y.^2 + x.*y);

x = 1;
y = 10;
z = myfunction(x,y)
z =

111


حال اگر بخواهیم یک انتگرال دو گانه بر روی ناحیه مثلثی x>=0 , x<=1 و y>=0 , y<=x بگیریم کافی است حدود را نیز به صورت تابع بی نام پاس کنیم:

myfunction = @(x,y) (x.^2 + y.^2+x.*y);

integral2(myfunction, 0,1,0,@(x) x)


در قسمت بعد چند مثال دیگر هم ذکر می کنیم. اما قبل از آن سعی کنید تا جایی که می توانید با آن بازی کنید تا قدرت و محدودیت هایش را یاد بگیرید.

@MatlabTips
#Lambda_Function , #Anonymous_Function
👆👆👆انرژی جنبشی سه توپ بزرگ در اثر برخورد به توپ کوچک منتقل میشود. نسبت جرم هر جفت توپ باید به گونه‌ای انتخاب شود تا تکانه به شکل مناسبی به توپ های دیگر منتقل شود.
#Fun
@MatlabTips
🔵برداری از هندل‌ها🔵
سطح پیچیدگی:🌕🌑🌑🌑🌑
پیش‌نیاز: خواندن پست‌های قبلی مربوط به گرافیک
برای: علاقه مندان به مفهوم گرافیک
📝هدف از این پست : درک set و get

اگر یک آبجکت گرافیکی دارای تعدادی فرزند باشد، فرمان get با ویژگی children برداری از هندل هایی را که به فرزندهای آبجکت مادر اشاره میکند برمیگرداند.
به عنوان یک مثال، یک نمودار سینوسی و یک سینوسی که بصورت نمایی میرا می شود در نظر بگیرید:
x = 0:pi/20:4*pi;
plot(x, sin(x))
hold on
plot(x, exp(–0.1*x).*sin(x), ’o’)
hold off

حالا خط زیر را در پنجره فرمان وارد کنید:
hkids = get(gca,'child')

متغیر hkids برداری است که دو المان دارد و حاوی هندل های گرافیکی است که فرزندان آبجکت gca هستند. سوال اینجاست که کدام المان برای کدام آبجکت است؟
واقعیت این است که این بردار ترتیب معکوس دارد. یعنی اولین المان برای آخرین آبجکتی است که ساخته شده است و ... .
برای مثال من میخواهم با استفاده از دستور set ویژگی های این آبجکت ها را تغییر دهم:
set(hkids(1), ’marker’, ’*’)
set(hkids(2), ’linew’, 4)

پی نوشت: gca مخفف graphic current axes است و اشاره میکند به چهارچوب مختصات که خود آبجکتی است که فرزند دارد و پدر آن پنجره figure است.
#Graphics , #Set, #Get, #For_all
@MatlabTips
قبل از دستکاری آبجکت ها