matlab 带参数函数调用,matlab的函数调用和参数传递

您所在的位置:网站首页 matlab的函数的传递函数模型 matlab 带参数函数调用,matlab的函数调用和参数传递

matlab 带参数函数调用,matlab的函数调用和参数传递

2023-03-30 07:20| 来源: 网络整理| 查看: 265

函数调用

在一个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.UserData=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');

以上内容源自百度空间...



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3