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 を 3 回呼び出します。

myFun
myFun
myFun
n =

     1


n =

     2


n =

     3

myFun をクリアしてから、さらに 2 回呼び出します。関数をクリアすると永続変数もクリアされます。

clear myFun
myFun
myFun
n =

     1


n =

     2

最後のログ入力から 3 秒以上経過しているとデータのログを取る関数を作成します。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 より前に導入