matlab gui七种参数传递方式和范围
MATLAB GUI的數(shù)據(jù)傳遞方式總匯(轉(zhuǎn)載)(2011-09-24 21:57:44) 轉(zhuǎn)載▼
matlab gui共有六種參數(shù)傳遞方式和范圍各不相同。
1.運用gui本身的varain{}、varaout{}傳遞參數(shù)(注:這種方式僅適用與gui間傳遞數(shù)據(jù),且只適合與主子結(jié)構(gòu),及從主gui調(diào)用子gui,然后關(guān)掉子gui,而不適合遞進(jìn)結(jié)構(gòu),即一步一步實現(xiàn)的方式)
輸入?yún)?shù)傳遞:
比如子GUI的名稱為subGUI, 設(shè)想的參數(shù)輸入輸出為:[out1, out2] = subGUI(in1, in2)
在subGUI的m文件中(由GUIDE自動產(chǎn)生):
(1).第一行的形式為:function varargout = subGUI(varargin)
該行不用做任何修改;varargin 和 varargout 分別是一個可變長度的cell數(shù)組(MATLAB幫助文件中有說明)。輸入?yún)?shù)in1和in2保存在varargin中,輸出參數(shù)out1,out2包含在varargout中;
(2).在subGUI的OpeningFcn中,讀入?yún)?shù),并用guidata保存,即:
handles.in1 = varargin{1};
handles.in2 = varargin{2};
guidata(hObject, handles);
返回參數(shù)的設(shè)置:
(1). 在GUI子程序的OpeningFcn函數(shù)的結(jié)尾加上uiwait(handles.figure1); figure1是subGUI的Tag;
(2). subGUI中控制程序結(jié)束(如”O(jiān)K”和”Cancel”按鈕)的callback末尾加上uiresume(handles.figure1),不要將delete命令放在這些callback中;
(3). 在子GUI的OutputFcn中設(shè)置要傳遞出去的參數(shù),如 varargout{1} = handles.out1;varargout{2} = handles.out2;末尾添加 delete(handles.figure1); 結(jié)束程序。
在GUI的OpenFcn中,如果不加uiwait,程序會直接運行到下面,執(zhí)行OutputFcn。也就是說程序一運行,返回值就確定了,再在其它部分對handles.output作更改也沒有效果了。
加上uiwait后,只有執(zhí)行了uiresume后,才會繼續(xù)執(zhí)行到OutputFcn,在此之前用戶有充分的時間設(shè)置返回值。
通過以上設(shè)置以后,就可以通過 [out1, out2] = subGUI(in1, in2) 的形式調(diào)用該子程序。
在一個GUI中調(diào)用另一個GUI時,主GUI不需要特別的設(shè)置,同調(diào)用普通的函數(shù)一樣。在打開子GUI界面的同時,主程序還可以響應(yīng)其它的控件。不需要擔(dān)心子GUI的返回值被傳錯了地方。
[size=+0][size=+0]2. 運用global定義全局變量傳遞參數(shù)(適用于gui內(nèi)控件間以及不同gui間)
這種方式恐怕是最簡單的方式,是很省心!但是但是,簡單的問題就在于有時你會很頭疼!因為在每一個要到該全局變量的地方,你都要添一句gloal x,還有就是如果你在一個地方修改了
x的值,那么所有x的值就都變了!有的時候恐怕會出現(xiàn)紊亂。另一個更重要的問題在于,套用C++的一句話,全局變量破壞了程序的封裝性!所以,全局變量是能少用盡量少用。
3. 運用UserData傳遞參數(shù)(gui內(nèi))
直接通過對象的userdata屬性進(jìn)行各個callback之間的數(shù)據(jù)存取操作。首先必須將數(shù)據(jù)存儲到一個特定的對象中,假設(shè)對象的句柄值為ui_handle,需要存儲的值為value,則輸入以下程序即可:
set(‘ui_handle’,'UserData’,Value);
此時,value數(shù)據(jù)就存在句柄值為ui_handle的對象內(nèi),在執(zhí)行的過程中若要取回變量可以通過以下方式在任意callback中獲取該數(shù)據(jù)值:
value=get(”ui_handle,’UserData’);
雖然使用這種方法簡單,但是每個對象僅能存取一個變量值,因此當(dāng)同一對象存儲兩次變量時,先前的變量值就會被覆蓋掉,因此都用UserData存儲簡單與單一的數(shù)據(jù)。如下面有兩個gui函數(shù), myloadfn加載mydata.mat文件,該文件內(nèi)存儲XYData變量,其值為m*2的繪圖矩陣,加載后將該變量值存儲到當(dāng)前的窗口的UserData屬性中。另一個myplotfcn函數(shù)則是用以獲取該UserData屬性中存取的繪圖數(shù)據(jù),然后繪圖。代碼如下:
function myloadfcn
load mydata;
set(gcbf,’UserData’,XYdata)
function myplotfcn
XYdata=get(gcbf,’UserData’);
x=XYData(:,1);
y=XYData(:,2);
plot(x,y);
4.應(yīng)用setappdata\getappdata與rmappdata函數(shù)(gui間和gui內(nèi),推薦使用)
使用上面三個函數(shù)最有彈性處理數(shù)據(jù)的傳送問題,與UserData的方式相類似,但是克服UserData的缺點,使一個對象能存取多個變量值。
(1)getappdata函數(shù)
VALUE=getappdata(H,NAME)
(2)setappdata函數(shù)
setappdata(H,NAME,VALUE)
(3)rmappdata
rmappdata(H,NAME)
首先在matlab命令窗口輸入magic(3)數(shù)據(jù),因此當(dāng)前的工作空間就存儲了magic(3)這組數(shù)據(jù)了,然后建立一個按鈕來獲取并顯示magic(3)數(shù)據(jù)
>>A=magic(3);
>> setappdata(gcf,’A',’A');%save
>> uicontrol(‘String’,’顯示矩陣A’,’callback’,'A=getappdata(gcf,’A')’);
當(dāng)在主子gui內(nèi)調(diào)用時,可以如下設(shè)置
fig1調(diào)用fig2時,使用fig2指令來打開fig2,
在fig2的m文件中,在回調(diào)函數(shù)中用setappdata(fig1,’A',A)實現(xiàn)返回fig1,并將參數(shù)A傳遞給fig1
然后在fig1的使用A的地方添加A=getappdata(fig1,‘A’)。
但這種方式的一個問題就是沒調(diào)用一次,fig1的數(shù)據(jù)就得初始化一次,這是因為setappdata(fig1,’A',A)中出現(xiàn)了fig1,調(diào)用一次setappdata就得運行一次fig1的緣故,解決方案就是把
setappdata(fig1,’A',A)改為setappdata(0,’A',A),這樣把A讀入matlab workspace,相當(dāng)于一個全局變量了,但當(dāng)然比直接用global定義全局變量好!
5.結(jié)合handles和guidata函數(shù)(gui內(nèi),不推薦使用,經(jīng)常出現(xiàn)問題,比如在handles中添加了變量對象Y后可能就會擠掉handles另外一個對象)
他的使用格式如下,如果你在pushbutton1中得到一個變量X,相傳出去,那么在pushbutton1的callback中,在得到X后添加如下代碼:
handles.X=X;
guidata(hObject,handles)(注意,一定是兩行連寫)
在pushbutton2中要用到X是,在其callback先添加 X=handles.X; 即可得到X的值。
6. 運用save和load(importdata)傳遞參數(shù)(gui內(nèi)和gui間)
將某變量x的值先存到磁盤,用的時候在調(diào)用。格式如下:save(‘*.mat’,'x’);用的時候就用load(‘*.mat’),但這樣只是把x讀到了matlab workspace,不會用顯示,你還要再去查看這個變量名, 然后才能用,建議使用p=importdata(‘*.mat’),p是一個結(jié)構(gòu)體,可以隨意使用了。當(dāng)然,這種方式涉及到磁盤讀寫,速度當(dāng)然會有影響的,一般情況不用,通常用在保存以及導(dǎo)入某個變量時!
7.使用labels=evalin('base','labels');%從workspace獲得labels的值
assignin('base','labels',labels);%修改后,放入workspace中
轉(zhuǎn)載于:https://www.cnblogs.com/daigaoyuan/archive/2012/10/18/2730173.html
總結(jié)
以上是生活随笔為你收集整理的matlab gui七种参数传递方式和范围的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vijos p1063(迎春舞会之集体舞
- 下一篇: cmd.exe命令行方式执行matlab