假设我想调用一个函数两次,但是我需要函数来记住第一次调用时初始化的变量,这样可以在后续调用中更改执行。
例如,如果我有一段这样的代码:
function random
if exist('a','var') == 0
fprintf('hello\n');
a = 1;
else
disp('goodbye\n');
end
end
当我再次调用代码时,如何让MATLAB记住a
等于1?具体来说,我希望在我正在编写的程序中使用它作为按钮回调函数。
答案 0 :(得分:5)
MATLAB支持关键字persistent
,您可以按如下方式使用:
function toggleval_persist
% Set up the persistent variable and initialize it.
persistent a;
if isempty(a)
a = 0;
end
if ( a == 0 )
disp('hello');
a = 1;
else
a = 0;
disp('goodbye');
end
end
另外,我不建议使用持久变量来切换按钮状态。如果你正在使用MATLAB的UI系统,那么按钮的状态通常可以在GUI的对象结构中使用。
答案 1 :(得分:-1)
你可以做什么(在GUI中使用此代码的光学系统中)设置一个标志,告诉a
是否已经初始化,并将其作为参数传递给函数random
。例如,在GUI的句柄结构中存储标志(让我们称之为a_flag
)将允许您跟踪其值(实际存储在handles.a_flag
中)。
换句话说,您可以在创建GUI期间将标志设置为0(如果使用GUIDE,则可以在Opening_Fcn
中设置),如下所示:
handles.a_flag = false;
然后在名为random
的函数中,您可以调用它:random(handles.a_flag)
:
function random(a_flag)
if ~a_flag
%// Update the flag
a_flag = true;
fprintf('hello\n');
a = 1;
else
fprintf('goodbye\n');
end
end
更简单的是使用全局变量......但我更喜欢这个想法:)
修改强>
我的代码的目的是证明我们可以使用GUI的句柄结构(如OP所要求的)来存储标志的值。由于每次回调都可以访问结构,按下按钮会以持久变量的相同方式更新它。
请尝试使用此代码查看我的意思:
function TestGUI
clear
clc
hFigure = figure('Position',[200 200 200 150]);
handles.Disp_a_title = uicontrol('Style','text','String','a','Position',[20 100 60 20]);
handles.Disp_aflag = uicontrol('Style','text','String','0','Position',[100 100 60 20]);
handles.Button = uicontrol('Style','Push','Position',[50 50 60 20],'String','Update a','Callback',@(s,e) PushCb);
a = 0;
handles.a_flag = false;
guidata(hFigure,handles)
function PushCb(~,~)
handles = guidata(hFigure);
fprintf('Flag is %i\n',handles.a_flag)
if handles.a_flag == false;
disp('hello\n');
a = 1;
handles.a_flag = true;
else
disp('goodbye\n');
end
guidata(hFigure,handles)
end
end
按两次按钮会在命令窗口中产生以下输出:
Flag is 0
hello\n
Flag is 1
goodbye\n
根据我的理解,OP正在寻找的预期行为。