函数调用之间的变量持久化

时间:2015-04-20 02:16:37

标签: matlab scope

假设我想调用一个函数两次,但是我需要函数来记住第一次调用时初始化的变量,这样可以在后续调用中更改执行。

例如,如果我有一段这样的代码:

function random
 if exist('a','var') == 0
   fprintf('hello\n');
   a = 1;
 else 
   disp('goodbye\n');
 end
end  

当我再次调用代码时,如何让MATLAB记住a等于1?具体来说,我希望在我正在编写的程序中使用它作为按钮回调函数。

2 个答案:

答案 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正在寻找的预期行为。