Main Content

MemoizedFunction

メモ化された関数を呼び出して結果をキャッシュ

説明

MemoizedFunction オブジェクトは、関数ハンドルのメモ化のセマンティクスと、関数呼び出しの結果のキャッシュを保持します。呼び出し構文は Function プロパティで指定された関数ハンドルと同じです。ただし、MemoizedFunction オブジェクトは関数ハンドルではありません。

メモ化された関数を特定の入力値の組み合わせではじめて呼び出すと、MATLAB®Function プロパティで指定された関数を実行して、結果をキャッシュします。それ以降にメモ化された関数を同じ入力値の組み合わせで呼び出すと、MATLAB はこの関数を再実行せず、キャッシュされた結果を返します。

MemoizedFunction オブジェクトは入力のキャッシュと、対応する出力を保持します。このオブジェクトを呼び出すと、MATLAB は次の条件が満たされている場合に、関連付けられたキャッシュ済みの出力値を返します。

  1. 入力引数がキャッシュ済みの入力と数値的に等しくなっている。入力値を比較する場合、MATLAB は NaN を等価として扱います。

  2. 要求された出力引数の数が、入力に関連付けられたキャッシュ済みの出力の数と一致している。

注意

MemoizedFunction オブジェクトは、基となる関数の更新を認識しません。メモ化された関数に関連付けられた関数を変更する場合、オブジェクト関数 clearCache でキャッシュをクリアします。

作成

MemoizedFunction オブジェクトを作成するには、関数 memoize を呼び出します。

関数のメモ化は、MemoizedFunction オブジェクトではなく、入力関数と関連付けられます。そのため、次のことに注意してください。

  • 新しい MemoizedFunction オブジェクトを同じ関数に作成すると、同じデータへの別の参照が作成されます。同じ関数をメモ化する 2 つの変数は、キャッシュおよびオブジェクト プロパティ値 (キャッシュ サイズなど) を共有します。次の例では、変数 ab はキャッシュを共有し、キャッシュ サイズが同じ値です。

    a = memoize(@svd);
    b = memoize(@svd);
    同様に、b のキャッシュ (b.clearCache) をクリアすると、a のキャッシュと、関数 svd をメモ化する他のすべての変数もクリアされます。clearCacheMemoizedFunction のオブジェクト関数です。

  • MemoizedFunction オブジェクトを新しい変数に割り当てると、同じデータへの別の参照が作成されます。次の例では、変数 cd はデータを共有しています。

    c = memoize(@svd);
    d = c;

  • 変数をクリアしても、その入力関数に関連付けられたキャッシュはクリアされません。ワークスペースに存在しなくなった MemoizedFunction オブジェクトのキャッシュをクリアするには、同じ関数に新しい MemoizedFunction オブジェクトを作成して、その新しいオブジェクトに関数 clearCache を使用します。あるいは、関数 clearAllMemoizedCaches を使用して、すべての MemoizedFunction オブジェクトのキャッシュをクリアできます。

プロパティ

すべて展開する

MemoizedFunction プロパティはメモ化された関数の動作を制御します。メモ化された関数のプロパティへのアクセスや変更ができます。ドット表記を使用して、特定のオブジェクトとプロパティを参照します。

m = memoize(@ones);
m.CacheSize = 25;

メモ化のセマンティクスを適用した関数。関数ハンドルとして返されます。このプロパティは読み取り専用です。

データ型: function_handle

キャッシュされた入力と出力の組み合わせの最大数。正の整数として指定します。

データ型: double

キャッシュ状態。true または false として指定します。結果がキャッシュされているかどうかにかかわらず Function プロパティで指定された関数を呼び出すよう MATLAB に指示し、結果をキャッシュしないよう指示するには、このプロパティを false に設定します。

データ型: logical

オブジェクト関数

clearCacheすべての MemoizedFunction オブジェクトのキャッシュのクリア
statsMemoizedFunction オブジェクトのキャッシュされた値と統計を返す

すべて折りたたむ

関数 datetime をメモ化して、MemoizedFunction オブジェクトを作成します。

mf = memoize(@datetime)
mf = 
  MemoizedFunction with properties:

     Function: @datetime
      Enabled: 1
    CacheSize: 10

キャッシュされた入力と出力の組み合わせの最大数を変更します。

mf.CacheSize = 2
mf = 
  MemoizedFunction with properties:

     Function: @datetime
      Enabled: 1
    CacheSize: 2

3 つの異なる入力値を使用して、メモ化された関数を呼び出します。

a = mf('today');
b = mf('yesterday');
c = mf('tomorrow');

関数 stats を使用して、キャッシュされた結果を調べます。

s = stats(mf);
s.Cache.Inputs{:}
ans = 1x1 cell array
    {'yesterday'}

ans = 1x1 cell array
    {'tomorrow'}

CacheSize が 2 であるため、'today' を使用してメモ化された関数を呼び出した結果はキャッシュされません。

現在の作業フォルダーに、数値の二乗を計算する関数が格納されたファイル memoizeSquareExample.m を作成します。この関数を呼び出すと、MATLAB がキャッシュされた結果を返した場合、msg は表示されません。

type memoizeSquareExample.m
function m = memoizeSquareExample(n)

m = n^2;
msg = "The square of " + string(n) + " is " + string(m) +".";
disp(msg)

end

関数をメモ化します。既定では、メモ化は有効になっています。

mf = memoize(@memoizeSquareExample);

同じ入力値を使用して、メモ化された関数を 2 回呼び出します。2 回目の関数呼び出しではキャッシュされた結果が返されるため、msg は 1 回しか表示されません。

a = mf(42);
The square of 42 is 1764.
b = mf(42);

メモ化を無効にし、繰り返しの入力値を使用してメモ化された関数を呼び出します。入力値 42 の結果はキャッシュされますが、メモ化は無効になっているため、msg が表示されます。

mf.Enabled = false;
c = mf(42);
The square of 42 is 1764.

別の入力値の組み合わせを使用して、メモ化された関数を呼び出します。

d = mf(13);
The square of 13 is 169.

関数 stats を使用して、キャッシュされた結果を調べます。MATLAB はメモ化が無効である場合キャッシュされた結果を返さず、統計の収集も行いません。入力値と出力値の格納は引き続き実行されます。

s = mf.stats();
s.Cache.Inputs{:}
ans = 1x1 cell array
    {[42]}

バージョン履歴

R2017a で導入