персистентный

Задайте персистентную переменную

Синтаксис

persistent var1 ... varN

Описание

пример

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

Для просмотра документации необходимо авторизоваться на сайте