matlab函數調用及數據傳遞


 

http://www.cnblogs.com/duanp/archive/2008/11/29/Matlab-GUIDE.html
函數調用


在一個m文件中,可以定義多個函數,但是文件名一定要與第一個函數(主函數)一致,
該文件中其他函數則為本文件的私有函數,外部不可訪問(可以通過參數調用的方法訪問,下面會描述)。

例如在一個程序中,創建一個fig后,會生成這樣一個m文件:

function varargout =febirdfun(varargin)
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @febirdfun_OpeningFcn, ...
                   'gui_OutputFcn',  @febirdfun_OutputFcn, ...
                   'gui_LayoutFcn',  [], ...
                   'gui_Callback',   []);

if nargin && ischar(varargin{1})
   gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
    gui_mainfcn(gui_State, varargin{:});
end

解析 一下這個主函數:首先 gui_State是一個結構,指定了figure打開和輸出函數,

開始 gui_CallBack為空,如果輸入參數個數不為0,接下來將輸入第一個參數傳遞給gui_State.callback。

接下來用交給 gui_mainfcn函數處理,gui_mainfcn 根據gui_State和傳入參數
來確定是執子函數,還是打開 fig 文件和運行 OpeningFcn和OutputFcn。

如過 gui_Callback為空,那么就運行打開主窗口fig文件,否則,調用子函數

這個函數的作用有:
1.當輸入不帶參數的時候,能夠打開fig文件,並且初始化控件
2.當指定需要調用的函數名時,可以作為其他控件callback使用 (實則調用同文件中的子函數)
   例如,在某一個控件的 callback 里面這樣寫:(febrdfun為主函數)
    febirdfun("@push_button_Callback",gcbf,[])
  這樣的調用就可以調用文件里面的子函數。

當然也可以使用其他文件里面的函數作為callback,不過那樣的話,數據傳遞會麻煩一些。


下面看figure Openning Function


%================================

function Main_OpeningFcn(hObject, eventdata, handles, varargin)

handles.output = hObject;
% 通常在這里面定義自己的數據結構例如

s=struct("P1",v1...
             "P2",v2);
handles.MyStruct=s;
% 更新handles數據結構  非常重要!!
guidata(hObject, handles);

%================================
function varargout = Main_OutputFcn(hObject, eventdata, handles)
varargout{1} = handles.output;

這個函數是輸出返回值的定義

注意:  matlab 中,function 對應的 end 可以沒有,但是隨着版本的更新,end將會被要求。


六:數據傳遞



在matlab GUI程序中進行值傳遞我經常使用的兩種方法:



1.利用主函數 的 handles 數據結構傳值



例如在某一個圖像窗口句柄 中有一個對象 handles(可以定義自己的數據結構)

那么在一個子Callback函數中,可以通過handles傳遞數據:

function  sliderbar1_Callback(hObject,eventdata,handles)

  %%  eg1

  v1=get(hObject,'value');

  obj=handles.Text1  %直接定位 Tag 為 Text1的控件

  set(obj,'value',v1);

  %%  eg2

  handles.MyStruct.P1=v1; % 更改handles中的數據

  guidata(hObject,handles); %更新 handles !!重要


end




2.利用控件的 UserData 來傳值


 
每一個控件一般都有一個屬於自己的自定義域,userData,你可以定義這樣一個域用來保存自己的數據,例如在定義 timer 的 TimerFcn中

t1=timer('TimerFcn',{@Timer1Fcn},'ErrorFcn',@Timer1ErrorFcn},'Period',1.0,'ExecutionMode','fixedrate');

t1.Userfata=handles.MyStruct;

這里 Timer1Fcn的調用看似沒有傳入任何參數,實際上此函數的定義一定要有至少兩個參數

function Timer1Fcn(obj,eventata)

   obj.UserData=XXXXX;%可以這樣共享數據
 
end

當然Timer定義的時候允許這樣傳遞一個參數,當然這樣也可以進行傳值.

t1=timer('TimerFcn',{@Timer1Fcn,handles},'ErrorFcn',{@Timer1ErroFcnr,handles},'Period',1.0,'ExecutionMode','fixedrate');

 

感謝:http://blog.sina.com.cn/s/blog_45b486b80100gs1p.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM