تبلیغات
آموزش مطلب - مطالب تیر 1385

guide

نویسنده :امین باشی
تاریخ:پنجشنبه 22 تیر 1385-09:07 ق.ظ

guide

در مورد گرافیک در مطلب خیلی صحبت کردم اما بدون صحبت از guide مطالبم ناقص است.

ویرایشگر رابط گرافیکی(guide) که از این پس ویرایشگر نامیده می شود  ساده ترین راه برای ایجاد رابط گرافیکی است .توسط این ویرایشگر شبیه تمام زبانهای ویژوال کافی است که مکان تکمه ها، نمودارها، منوها و ... انتخاب کرده و رابط گرافیکی خوتان را ایجاد کنید.

اگر از ویرایشگر مطلب 7.0 استفاده کنید نمی توانید از رابط ایجاد شده در نسخه های پایین تر مطاب استفاده کنید. البته امکان ذخیره کردن رابط به صورت m-file که در نسخه های پایین تر قابل استفاده باشد نیز وجود دارد اما  ترچیح می دهم که این کار را نکنم و در صورت لزوم رایط گرافیکی را مستقیما با نوشتن دستورات مطلب ایجاد کنم.

  ویرایشگر رابط گرافیکی ایجاد شده را در دو فایل ذخیره می کند.یک fig-file و یک m-file . چیدمان نمودارها و .... در fig-file ذخیره می شود و m-file برای برنامه نویسی استفاده می شود.

اولین کار برای ایجاد رابط - پیدا کردن یک تیکه گچ ، کشیدن رابط و ... رابط اسم یک بازی است که قدیما  از صبح تا شب بازی می کردیم - کشیدن یک طرح از پنجره مورد نظر روی کاغذ است .بعد از این کار دستور guide را اجرا کرده و طرح خود را در ویرایشگر می کشیم .

بعد از این کار باید ویژگی های اشیا قرار داده شده را تنظیم کنیم.مهمترین ویژگی که باید تنظیم شود ویژگی tag است.برای دسترسی به لیست ویژگی ها روی شئ مورد دوبار کلیک کنید.

در قسمت tag یک اسم یکتا را وارد کنید، اگر در لیست باز شده به قسمت callback  (اگر وجود داشته باشد) نگاه کنید خواهید دید که در مقابل عبارت automatic ذکر شده است.معنی این عبارت این است که در m-file ایجاد شده یک تابع به اسم tag_Callback ایجاد می شود گه به جای tag اسمی که وارد کردید قرار می گیرد(البته گاهی بهتر است که برای گروهی از اشیا یک اسم انتخاب کنید).

پس از ذخیره یرنامه m-file آن باز می شود. در m-file ایجاد شده توضیحات کامل برای کار آن توسط مطلب قراردهده شده است .در اینجا مقداری از آنها را برسی می کینم. 

ویرایشگر را باز کنید و یک Edit Text، یک Static Text . یک Push Bottun در صفحه باز شده قرار دهید(در منو سمت چپ می توانید اینها را پیدا کنید).بر روی هرکدام از این اشیا کلیک کرده تا لیست ویژگی های هرکدام باز شود.می بنید که برای ویژگی tag مربوط به Edit Text عبارت edit1 نوشته شده است.می توانید هر عبارت دیگری را بنوسید اما من تغیری در آن و در tag مربوط به دیگر اشیا نمی دهم.

من برنامه را به اسم guitest ذخیره کرده ام در m-file باز شده 6 تابع دیده می شود.

guitest

guitest_OpeningFcn

guitest_OutputFcn

نظیر این سه تابع در همه رابطهایی که با ویرایشگر ایجاد می شود وجود دارد و توابع دوم و سوم تابع داخلی تابع guitest (اسمی که رابط با آن ذخیره شده است) می باشند.

سه تابع دیگر در این m-file دیده می شود

edit1_Callback

edit1_CreateFcn

pushbutton1_Callback

در اینجا با تابع edit1_CreateFcn کاری نداریم  در لیست ویژگی های Edit text در مقابل  CreateFcn عبارت automatic نوشته شده است اگر این عبارت را پاک کنید این تابع ایجاد نخواهد شد.عملکرد این تابع همانند تابع guitest_OpeningFcn است .

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

% hObject handle to edit1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'String') returns contents of edit1 as text
% str2double(get(hObject,'String')) returns contents of edit1 as a double

عبارت edit1 همان عبارتی است که در مقابل ویژگی tag شئ Edit Text نوشتیم و hobject دستگیره مربوط به این شئ است.

eventdata در حال حاضر در مطلب کاربرد ندارد

handles یک متغیر از نوع structure است.در این متغیر دستگیره تمام اشیا موجود در رابط قرار دارند.شما می توانید هر داده مورد نیاز را در آن قرار دهید.

و اما guidata

با کمک این دستور می توان متغیر handles به عنوانguidata ( داده های مورد نیاز تابع guitest) تعریف کرد و در هر قسمت از این تابع به این داده ها دسترسی پیدا کرد. با این کار نیازی به استفاده از متغیرهای سراسری و یا دستورات مشابه نیست.

این دستورات را به تابع edit1_Callback اضافه کنید

input = str2double(get(hObject, 'String'));
handles.metricdata.input = input;
guidata(hObject,handles)

دستور اول رشته موجود در شئ edit1 را به عدد تبدبه عنوان guidataیل می کند.دستور دوم این عدد را در متغیر handles ذخیره می کند و دستور سوم این متغیر را به عنوان guidata تعریف می کند.

شکل استفاده از دستور guidata به این صورت است.

guidata(object_handle, data)

آرگومان object_handle دستگیره رابط گرافیکی است ولی می توان دستگیره هر کدام از اشیا موجود در رابط را به جای به کار برد.

در زیر تابع pushbutton1_Callback دستورات زیر را اضافه کنید.

output = handles.metricdata.input * 3;
set(handles.text1, 'String', output);

واضح است که دستور اول عدد وارد شده در edit1 را در 3 ضرب کرده و در متغیر output قرار می هد.

برای دسترسی به دستگیره یک شئ کافی است به متغیر handles و فیلدی به اسم tag ان شئ مراجعه کیند.

لینکهای زیر رابط گرافیکی ایجاد شده برای این برنامه و یکی از مثالهای مطلب می باشد.که با مطلب 7.0 درست شده اند.

http://amin.bashi.googlepages.com/Guitest.rar

http://amin.bashi.googlepages.com/Guitest2.rar



نوع مطلب : GUIDE 

evalin

نویسنده :امین باشی
تاریخ:سه شنبه 20 تیر 1385-08:07 ق.ظ

در پست قبلی با فضای کار(workspace) در مطلب آشنا شدیم، امروز دستور evalin را برسی می کنیم.این دستور نیز برای کار کردن با فضای کار می باشد.

در اکثر زبانهای برنامه نویسی مفهومی به اسم متغیر سراسری و متغیر محلی وجود دارد.در مطلب برای تعریف نتغیر سراسری از دستور global استفاده می شود.استفاده از متغیرهای سراسری ساده ترین کار در هنگام کار با فضای حالت است اما همیشه ساده ترین راه قشنگ ترین راه نیست.

 توابعی که در پست قبلی استفاده کردیم را با کمی تغیر دوباره  مورد استفاده قرار می دهیم

 

function b=testcaller
testcurrent
m=67;
r=m+l

-------------

function testcurrent
assignin('caller','b',23)
assignin('base','t',33)
m=34;
evalin('base','b=t+2') % 1
evalin('caller','l=b+2') % 2
r= evalin('base','b+3')+evalin('caller','b+2')+m %3

دستور 1 متغیر b را برابر با جمع t و 2 قرار می دهد (این متغیرها در فضای base- فضای کار اصلی مطلب- قرار دارند)

دستور2  متغیر b را که در فضای کار تابع testcaller قرار دارد با 2 جمع کرده و در متغیر l قرار می دهد.

دستور 3 متغیر b که در base قرار دارد را با نتغیر b که در caller قرار دارد و متغیر محلی m را جمع کرده و در r قرار می دهد.

حال دستور h=testcaller را اجرا کنید بعد از پایان برنامه باید متغیرهای t,h,b در فضای base وجود داشته باشند.



نوع مطلب : evalin 

نویسنده :امین باشی
تاریخ:شنبه 17 تیر 1385-07:07 ق.ظ

Worcspace

حافظه ای که برای ذخیره متغیرها اختصاص داده می شود فضای کار نام دارد.چند نوع فضای کار در مطلب وجود دارد.فضایی به نام base که مروبط به فضای کار اصلی مطلب است فضایی به نام current که مربوط به فضای کاری جاری است؛ و فضای کاری parent یا caller .

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

 

function testcurrent
assignin('caller','b',23)
assignin('base','t',33)
m=34

و فایل

function b=testcaller
 testcurrent

m=67

هر تابع برای خود یک فضای کاری مسقل دارد یعنی اگر در درون دو تابع یک متغیر وجود داشته باشد مقدار این متغیر در دو تابع برابر نخواهد بود.

حالا د رخط فرمان دستور h=testcaller را اجرا کنید.

با اجرای این دستور تابع testcaller اجرا می شود.این تابع  خود تابع  testcurrent  را فراخوانی می کند؛ در این حالت فضای کاری تابع testcaller به عنوان caller فضای کاری تابع   testcurrent در نظر گرفته می شود.

با اجرای تابع  testcurrent دستورات این تابع اجرا می شوند. با اجرای دستور اول متغیر b به درون فضای تابع testcaller فرستاده می شود.با اجرای دستور دوم متغیر t به فضای کاری base فرستاده می شود.

خروجی تابع testcaller متغیر b است که مقدار آن در متغیر h ذخیره می شود.

 



نوع مطلب : workspace 

fit

نویسنده :امین باشی
تاریخ:چهارشنبه 14 تیر 1385-03:07 ق.ظ

fit

معمولا پدیده های انتقال (انتفال جرم و حرارت و مکانیک سیالات) پیچیده تر از آن هستند که روابط حاکم بر آنها از طریق تئوری بدست آوریم؛ و از طریق آزمایش و ایجاد داده های تجربی، روابطی برای آنها بدست می آید.معمولا بعد از هر آژمایش نیاز به اختصاص دادن یک فرمول به داده های ایجاد شده است.استفاده از نرم افزار Excel ساده ترین راه این کار است اما در محیط مطلب نیز این کار قابل انجام است.

کار دستور fit برازش منحنی برای داده های موجود است .

fresult = fit(xdata,ydata,'ltype')

آرگومان ltype مربوط به نوع مدلی است که برای برازش انتخاب می کنیم.منظور خطی، درجه دوم، درجه سوم، سینوسی و ...... می باشد.حتی می توانید مدل خاص خودتان را تعریف کنید.

فرض کنید که

x=[1.1000 2.2000 2.9000 3.8000 5.0000]';

y=[ 0.9000 2.1000 3.0000 4.0000 5.0000]';

یادتون باشه که x,y حتما باید ستونی باشند.

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

poly1                           Y = p1*x+p2
poly2                           Y = p1*x^2+p2*x+p3
poly3                           Y = p1*x^3+p2*x^2+...+p4
...
poly9                           Y = p1*x^9+p2*x^8+...+p10

برای دیدن لست کامل مدل های موجود کافی است دستور cflibhelp را اجرا کنید.

دستور fit امکانات بسیار زیادی دارد که اگر وقت کنم بطور کامل توضیح خواهم داد.

fit1=fit(x,y,'poly1')

با اجرای این دستور خروجی زیر حاصل می شود.

fit1 =

Linear model Poly1:
fit1(x) = p1*x + p2
Coefficients (with 95% confidence bounds):
p1 = 1.069 (0.92, 1.217)
p2 = -0.2056 (-0.6934, 0.2822)

خروجی این دستور به صورت structure است.یعنی اگر بخواهیم مقدار p1 را بدانیم کافی است بنویسیم

fit1.p1

 



نوع مطلب : برازش منحنی 

نگانیو کردن عکس

نویسنده :امین باشی
تاریخ:یکشنبه 11 تیر 1385-03:07 ق.ظ

اگر بخواهیم یک عکس سیاه و سفید را نگاتیو کنیم چی کار باید کرد؟

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

اولین کار ایجاد یک پنچره برای این کاره

figure('unit','pixel','pos',[50 100 950 600])

a1=axes('unit','pixel','pos',[50 150 400 400],'vis','off');

a2=axes('unit','pixel','pos',[500 150 400 400],'vis','off');

uicontrol('unit','pixel','pos',[225 50 50 25],'string','start','callback','alg(x,a2)');

uicontrol('unit','pixel','pos',[675 50 50 25],'string','exit','callback','close all');

من این پنجره را برای وضوح 1024*768 تنظیم کردم.حالا باید عکس مورد نظر را وارد محیط مطلب کنیم.

x=imread('pic.bmp');

مطلب تصویر را به دو حالت ذخیره می کند.الان با حالت RGB کار می‌کنیم. سه خط بعدی تصویر را به حالت RGB تبدیل می‌کنند.

if ~isrgb(x)

    x=ind2rgb(x);

end

و حالا نمایش تصاویر

y=x;

image('parent',a1,'cdata',x)

image('parent',a2,'cdata',y);

حالا باید یک تابع بنویسیم که تبدیل مورد نظر رو روی عکس انجام بدهد.

 function alg(x,a2)

[m,n,k]=size(x);

yy=[];

hy=image('cdata',yy,'parent',a2);

for i=1:m

    for j=1:n

        if x(i,j,1)== 0 & x(i,j,2)== 0 x(i,j,3)== 0;

            yy(i,j,=[1 1 1];

        else

            yy(i,j,=[0 0 0];

        end

    end

    set(hy,'cdata',yy,'parent',a2)

    drawnow

    حتما همه می‌دانید که دستورات بالا مربوط به یک فایل جداگانه به اسم alg.m است.

در حالت RGB هر تصویر به صورت یک ماتریس m*n*3 ذخیره می‌شود.m,n شماره پیکسل است.در هر m,n سه درایه وجود دارد که رنگ پیکسل است.

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

چون تصویر ما سیاه و سفید است  می توانستیم شرط برنامه را به صورت

        if x(i,j,1)== 0

بنوسیم، اما در حالت کلی باید شرط را بطور کامل نوشت.

می‌شود الگوریتم‌های سریع‌تری برای این کار نوشت اما اصول کار همین مطالبی است که یاد گرفتیم.



نوع مطلب : figure 





All right reserved©2005 Amin Bashi