Main Content

persistent

定义持久变量

说明

示例

persistent var1 ... varN 将变量 var1 ... varN 声明为持久变量。持久变量是声明它们的函数的局部变量;但其值保留在对该函数的各次调用所使用的内存中。MATLAB® 命令行和其他函数中的代码不能更改持久变量。

当 MATLAB 首次遇到特定 persistent 语句时,它将持久变量初始化为空矩阵 ([])。

在您清除或修改内存中的函数时,MATLAB 会清除持久变量。要将函数保留在内存中,请使用 mlock

示例

全部折叠

在当前工作文件夹中创建 myFun 函数。每次调用函数时,n 的值都会增加。

function myFun()
    persistent n
    if isempty(n)
        n = 0;
    end
    n = n+1
end

在命令提示符下,调用 myFun 三次。

myFun
myFun
myFun
n =

     1


n =

     2


n =

     3

清除 myFun 并再调用它两次。清除该函数会同时清除持久变量。

clear myFun
myFun
myFun
n =

     1


n =

     2

编写一个函数,该函数在距离上个日志项至少三秒后开始记录数据。将 logTime 定义为持久变量,用于存储 logData 上次写入文件的时间。

在当前工作文件夹中的文件中,定义 logData 函数。

function logData(fname,n)
    persistent logTime
    currTime = datetime;
    
    if isempty(logTime)
        logTime = currTime;
        disp('Logging initial value.')
        dlmwrite(fname,n)
        return
    end
    
    dt = currTime - logTime;
    if dt > seconds(3)
        disp('Logging.')
        dlmwrite(fname,n,'-append')
        logTime = currTime;
    else
      disp(['Not logging. ' num2str(seconds(dt)) ' sec since last log.'])
    end
end

在命令提示符下,循环调用 logData。该循环有 10 次迭代,每次迭代大约需要 1 秒。因此,MATLAB 将 4 个值写入 myLog.txt(大约在 0、3、6 和 9 秒的时刻)。

for n = 1:10
    pause(1)
    logData('myLog.txt',rand)
end
Logging initial value.
Not logging. 1.005 sec since last log.
Not logging. 2.009 sec since last log.
Logging.
Not logging. 1.007 sec since last log.
Not logging. 2.013 sec since last log.
Logging.
Not logging. 1.005 sec since last log.
Not logging. 2.007 sec since last log.
Logging.

再次调用 logData 函数以追加另一个值。

logData('myLog.txt',rand)
Logging.

清除 logData 函数以重新初始化持久变量。再次调用 logData 函数。这次,该函数将覆盖 myLog.txt 而不是追加值。

clear logData
logData('myLog.txt',rand)
Logging initial value.

提示

  • 持久变量与全局变量类似,因为 MATLAB 为二者都建立持久存储。二者的区别在于持久变量仅为声明它们的函数所知晓。因此,MATLAB 命令行或其他函数中的代码不能更改持久变量。

  • 由于 MATLAB 将持久变量初始化为一个空矩阵 ([]),通常函数会检查持久变量是否为空,如果是,则初始化该持久变量。

    function myFun()
        persistent n
        if isempty(n)
            n = 0;
        end
        n = n+1;
    end

  • 必须先将变量声明为持久变量,然后才能对该变量进行任何其他引用,包括输入或输出参数。例如,以下函数中的 persistent 声明无效。

    function myfunA(x)
        persistent x
    end
    
    function myfunB
        x = 0;
        persistent x
    end

  • 要清除持久变量,请使用 clear 和声明该变量的函数的名称。例如,clear myFun

扩展功能

版本历史记录

在 R2006a 之前推出

另请参阅

| | | | |