在matlab中将句柄发送给匿名函数?

时间:2014-03-23 11:37:31

标签: matlab user-interface

作为主题,我试图发送句柄,以便匿名函数可以与GUI的其余部分进行交互。但是,当查看匿名函数中的输入时,它们会变空。

这里将功能添加到GUI:

x=5;
y=3;
z=4;
set(gca,'ButtonDownFcn', @(y,z,x)mousecontroll_callback)

内部函数会对你点击的内容做出反应,但它无法读取y,z或x

function mousecontroll_callback(y,z,x)
...

运行此GUI时出现此错误消息,它是从另一个名为otherGUI的GUI调用的 “使用screenmode> screenmode_OutputFcn时出错 输入参数太多。

gui_mainfcn出错(第265行)         feval(gui_State.gui_OutputFcn,gui_hFigure,[],         gui_Handles);

screenmode出错(第42行)     gui_mainfcn(gui_State,varargin {:});

otherGUI>全屏错误(第1031行) screenmode(图像,范围); 评估uimenu回调时出错“ - 但是当没有弄乱匿名函数的输入并试图让他们知道代码运行时。

我不想再使用全局变量,任何人都知道如何获取此函数来获取x,y,z,以后将成为句柄?

2 个答案:

答案 0 :(得分:0)

试试这个:

 set(gca,'ButtonDownFcn', { @mousecontroll_callback , x,y,z} );

 ...

 function mousecontroll_callback(hObj,evt,x,y,z)

 end

{}语法让Matlab知道您想传递其他变量。


请注意,xyz值将作为closure上下文的一部分被冻结,即使您更新它们也会相同。如果你想这样做,你需要找到另一个解决方案,例如:

  • 使用guidata全局数据存储来传输结构(像指南一样) - 最受欢迎的解决方案。
  • 创建您自己的handle对象,该对象将传递给所有函数
  • 使用全局变量
  • 使用嵌套函数,类似于使用全局变量

答案 1 :(得分:0)

您的代码中存在错误,这意味着它没有按您的想法执行。

x=5;
y=3;
z=4;
set(gca,'ButtonDownFcn', @(y,z,x)mousecontroll_callback)

如果您有上述代码,我猜您希望在按下按钮时执行以下命令:

mousecontroll_callback(3,4,5);

实际上,通过将参数放在@符号后面,您实际上创建了一个包装函数,如下所示(baz

x=5;
y=3;
z=4;
set(gca,'ButtonDownFcn', @baz)

function foo = baz(b,c,a)
  mousecontroll_callback
end

如果您使用以下内容,它应该按预期工作:

set(gca,'ButtonDownFcn', @() mousecontroll_callback(y,z,x));

我还建议您查看MathWorks documentation on anonymous functions