Matlab匿名回调函数参数

Matlab匿名回调函数参数,matlab,callback,arguments,anonymous-function,Matlab,Callback,Arguments,Anonymous Function,下面是Matlab中的模型-视图-控制器GUI示例,我有一个关于匿名函数回调输入参数的问题 下面是一个视图函数,它创建gui句柄并将它们作为输入参数传递给onChanged回调函数 function handles = View_TimeDomain(m) %VIEW a GUI representation of the signal model % build the GUI handles = initGUI(); onChangedF(handles,

下面是Matlab中的模型-视图-控制器GUI示例,我有一个关于匿名函数回调输入参数的问题

下面是一个视图函数,它创建gui句柄并将它们作为输入参数传递给onChanged回调函数

function handles = View_TimeDomain(m)
    %VIEW  a GUI representation of the signal model

    % build the GUI
    handles = initGUI();
    onChangedF(handles, m);    % populate with initial values

    % observe on model changes and update view accordingly
    % (tie listener to model object lifecycle)
    addlistener(m, 'f', 'PostSet', ...
        @(o,e) onChangedF(handles,e.AffectedObject));
end
我不太明白的第一件事是,根据Matlab文档,第一个参数必须是事件源,第二个参数必须是事件数据(,),但在本例中,它是
句柄
。触发事件时,将按预期调用以下onChangedF函数

function onChangedF(handles, model)
    % respond to model changes by updating view
    if ~ishghandle(handles.fig), return, end
    set(handles.line, 'XData',model.t, 'YData',model.data)
    set(handles.slider, 'Value',model.f);
end
但是,在本例中,句柄是包含使用initGui()定义的句柄的结构,而不是事件源

我猜这源于匿名函数的定义:

@(o,e) onChangedF(handles, e.AffectedObject)
假设
o
onChangedF
函数输入中未使用的源,我是否正确。有人能解释一下为什么匿名函数的这种语法是有效的吗? 我认为
o
也需要成为这个特定回调函数的参数。大概是这样的:

@(o,e) onChangedF(o, handles, e.AffectedObject)
在函数末尾附加了其他参数。 然后使用~,避免这个未使用的参数:

function onChangedF(~, handles, model)
    % respond to model changes by updating view
    if ~ishghandle(handles.fig), return, end
    set(handles.line, 'XData',model.t, 'YData',model.data)
    set(handles.slider, 'Value',model.f);
end
是的一个子集,允许您完全内联定义函数,而不是执行其他地方存在的函数的函数句柄

匿名函数的语法为
af=@(arglist)匿名函数
,其功能与:

function af(arglist)
    anonymous_function
end
这意味着您的
PostSet
回调在功能上等同于:

function PostSet(o,e) 
    onChangedF(handles, e.AffectedObject)
end
满足MATLAB的要求

由于创建
PostSet
匿名函数时,
handles
位于函数范围内,因此它也可在匿名函数回调的范围内使用。这将在匿名函数文档的一节中解释。这也可以使用函数可视化,该函数提供有关函数句柄的信息:

z = 50;
fh = @(x, y) thing(y, z);

fhinfo = functions(fh);
fhworkspace = fhinfo.workspace{1}
返回:

fhworkspace = 

  struct with fields:

    z: 50

你不需要把
o
作为onChangedF的参数,因为这个函数不是你的回调函数。calback函数是匿名函数,它使用所需的参数调用函数。例如,您可以有一个匿名函数,它是
@(o,e)data=sqrt(5)
,我不知道您是否明白我的观点,但问题是在回调中(匿名或不匿名)您可以使用任何参数调用任何函数,因为您调用的函数不是回调函数,因此它们不需要指向回调事件的任何参数链接。感谢您的帮助。因此,
@(o,e)
是源数据和偶数数据的某种占位符,必须根据matlab文档提供?