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

Variable persisting between function calls

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

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

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

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

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 的对象结构中可用。

你可以做的(在 GUI 中使用这段代码的光学)设置一个标志,告诉 a 是否已经初始化,并将它作为参数传递给函数 random.例如,将标志(我们称之为 a_flag)存储在 GUI 的句柄结构中,可以让您跟踪其值(实际上存储在 handles.a_flag 中)。

换句话说,您可以在创建 GUI 期间(或者如果您使用的是 GUIDE,则在其 Opening_Fcn 中)将标志设置为 0,如下所示:

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

按两次按钮会在命令中产生以下输出 Window:

Flag is 0
hello\n
Flag is 1
goodbye\n

据我了解,这是 OP 正在寻找的预期行为。