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
Для просмотра документации необходимо авторизоваться на сайте