我正在为具有多个运行回调函数的GUI项的图形窗口编写代码。目前我有一个文本框和一个滑块控件,我进行了设置,以便更改文本框值不仅会更改显示的数据,还会更新滑块位置以匹配该值。我遇到的问题是试图保持我的varargin
参数(在创建图形窗口时输入到main函数)被包含在父cell
变量中。当我的顶级varargin
包含值参数对时,varargin
是维度1x2的cell
。没关系。通常,可以将所有这些参数传递给内部函数调用,如下所示:
function topfunc(varargin)
%code
do_something(varargin{:})
函数dosomething
可以看到正确的参数列表。但是当我通过callback
定义传递varargins时,就像在
txtui = uicontrol(hf,'Style','edit','string',fristframe,'backgroundcolor','y',...
'position',[10 100 50 20],'Tag','Scaler','UserData',lsatframe,...
'Callback',{@doslide,adcname,mode,goodframes,{varargin{:}} } );
然后函数doslide
调用绘图更新函数dordplot
function doslide(theui,event,fileName,mode, goodframes,varargin)
% code snipped...
dordplot(slidinfo,event,fileName,mode,goodframes,varargin{:});
end
在doslide
内,varargin
是包含预期的1x2单元格的1x1单元格。
我在最后一个函数中添加了一个kludge修复程序,其中实际使用了varargin
的内容,其中包含
varargin = varargin{:};
但是varargin
首先被包裹在一个单元格中似乎是错误的
有没有修复,或者我是否错误地定义了我的回调函数调用?
答案 0 :(得分:5)
根据varargin
的文档:
当函数执行时,
varargin
是1-by-N
单元格数组,其中N
是函数接收后的输入数量 明确声明的输入。
在你的回调声明中,你有:
{@doslide,adcname,mode,goodframes,{varargin{:}}}
将大括号中的varargin{:}
连接回一个单元格数组,因此您只需在doslide
之后将1个输入传递给goodframes
。
删除大括号:
{@doslide, adcname, mode, goodframes, varargin{:}}
答案 1 :(得分:1)
在matlab中,具有多索引单元格索引(c{:}
,c{array}
)单元格数组的表达式是值列表。值列表只是单元格数组元素的逗号分隔列表。例如,对于单元阵列
c={1,2,3,4}
c{:}
的值非常1,2,3,4
。所以行d= c{:}
意味着
d=1,2,3,4
。这是一个错误。
UPD:我不对,d=1,2,3,4
不是错误,它是表达d=1
的一种方式。无论如何,{varargin{:}}
相当于varargin
,因为varargin{:}
表示varargin
的所有元素的逗号分隔列表