ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

afterEach

parallel.Future が完了するたびに呼び出す関数を指定する

説明

outputFuture = afterEach(futures,funtocall,nout) は、futures の各要素が使用可能になると、その出力引数について自動的に funtocall を評価します。afterEachfuntocall を出力引数 nout と共に呼び出し、出力を保持する outputFuture を生成します。

afterEach は、parfeval を使用した並列計算時に、プロットやアプリなどのユーザー インターフェイスの更新に使用すると便利です。たとえば、parfeval を使用して複数の計算をワーカーに送信し、各計算の完了時に afterEach を使用してユーザー インターフェイスを更新します。

passFuturefalse の場合、outputFuture = afterEach(futures,funtocall,nout,'PassFuture',passFuture) は同様に動作します。passFuturetrue の場合、afterEach は、futures の出力引数ではなく、その各要素に対して funtocall を呼び出します。これは、futures の要素でエラーが発生した場合でも発生します。

すべて折りたたむ

afterEach を使用して、parfeval の各計算結果に対して自動的に関数を呼び出すことができます。

parfeval を使用して、ワーカーで乱数ベクトルを計算します。parfevalparpool が作成されていなければ、自動的に既定の設定で作成します。

for idx = 1:10
    f(idx) = parfeval(@rand, 1, 1000, 1);
end

これらのベクトルが作成されたら、それぞれの最大要素を表示します。afterEach は、各 Future が使用可能になると、それぞれの出力に対して関数ハンドルを実行します。

afterEach(f, @(r) disp(max(r)), 0);
    0.9975

    0.9990

    0.9982

    0.9991

    0.9982

    0.9998

    0.9999

    0.9986

    0.9996

    0.9990

afterEach afterAll を組み合わせて、Future の結果に対して、さらに関数を自動的に呼び出すことができます。afterEachafterAll はいずれも、afterEachafterAll で再利用可能な future 変数を生成します。

parfeval を使用して、ワーカーで乱数ベクトルを計算します。parfevalparpool が作成されていなければ、自動的に既定の設定で作成します。

for idx= 1:10
    f(idx) = parfeval(@rand, 1, 1000, 1);
end
Starting parallel pool (parpool) using the 'local' profile ...
connected to 8 workers.

ベクトルが使用可能になったら、各ベクトルの最大要素を計算します。afterEach は、Future が使用可能になったら、各 Future の出力に対して関数ハンドルを実行し、別の Future を作成して結果を格納します。

maxFuture = afterEach(f, @(r) max(r), 1);

これらの最小値を計算するために、この新しい Future について afterAll を呼び出します。afterAll は、すべての Future が完了した後、すべての Future の出力引数の結合に対して関数を実行します。この場合、afterAll は、maxFuture の完了後にその出力に対して関数 min を実行し、別の Future を作成して結果を格納します。

minFuture = afterAll(maxFuture, @(r) min(r), 1);

この結果は、fetchOutputs を使用して取得できます。fetchOutputs は、Future が結果の収集を完了するまで待ちます。

fetchOutputs(minFuture)
ans = 0.9973

fetchOutputs を future 変数で呼び出して、afterEach の結果を確認できます。

fetchOutputs(maxFuture)
ans = 10×1

    0.9996
    0.9989
    0.9994
    0.9973
    1.0000
    1.0000
    0.9989
    0.9994
    0.9998
    0.9999

parfeval を使用してワーカーで非同期の計算を実行し、ユーザー インターフェイスを応答可能な状態に保つことができます。中間計算が使用可能になったら、afterEach を使用してユーザー インターフェイスを更新します。すべての計算が使用可能になったら、afterAll を使用してユーザー インターフェイスを更新します。

waitbar を使用して単純なユーザー インターフェイスを作成します。

h = waitbar(0, 'Waiting...');

parfeval を使用して、乱数行列の固有値などの時間のかかる計算をワーカーで実行します。計算は非同期で実行され、計算中にユーザー インターフェイスが更新されます。parfevalparpool が作成されていなければ、自動的に既定の設定で作成します。

for idx = 1:100
  f(idx) = parfeval(@(n) real(eig(randn(n))), 1, 5e2); 
end

各計算が使用可能になったら、afterEach を使用してその最大値を計算します。各 Future が完了するたびに、afterEach を使用して、ウェイトバーに示される終了した Future の比率を更新します。

maxFuture = afterEach(f, @max, 1);
updateWaitbarFuture = afterEach(f, @(~) waitbar(sum(strcmp('finished', {f.State}))/numel(f), h), 1);

すべての計算が完了したら、ウェイトバーを閉じます。閉じる操作で自動的に続行するには、afterAllupdateWaitbarFuture に対して使用します。afterAll は Figure のハンドルを updateWaitbarFuture から取得し、その関数をハンドルに対して実行します。

closeWaitbarFuture = afterAll(updateWaitbarFuture, @(h) delete(h), 0);

すべての最大値を計算した後、ヒストグラムを表示します。操作を自動的に続行するには、afterAllmaxFuture に対して使用します。afterAllmaxFuture から最大値を取得し、それに対して histogram を呼び出します。

showsHistogramFuture = afterAll(maxFuture, @histogram, 0);

future 変数の計算でエラーが発生した場合、既定で afterEach はエラーの発生した要素についてその関数を評価しません。たとえば、更新するユーザー インターフェイスがあるなど、任意のエラーを処理する場合は、名前と値のペア PassFuture を使用できます。true に設定されている場合、future 変数はコールバック関数に渡されます。これに対して fetchOutputs を呼び出し、出力を処理して、考えられるエラーすべてに対処できます。

parfeval を使用してワーカーに計算を送信します。parfevalparpool が作成されていなければ、自動的に既定の設定で作成します。parfeval の計算でエラーが発生した場合、future 変数はエラーになり、その Error プロパティに反映されます。

errorFuture = parfeval( @(n) randn(n), 0, 0.5);
wait(errorFuture);
errorFuture.Error
ans = 
  ParallelException with properties:

     identifier: 'MATLAB:NonIntegerInput'
        message: 'Size inputs must be integers.'
          cause: {}
    remotecause: {[1×1 MException]}
          stack: [1×1 struct]

その Future に対して afterEach を使用すると、エラーになった Future の要素についてコールバック関数は評価されません。以下のコードでは、Future のエラーのため、msgbox が実行されません。

afterEach(errorFuture, @() msgbox('Operation completed'), 0);

結果がエラーになる Future を扱うには、afterEach を呼び出すときに名前と値のペア PassFuture を使用します。出力ではなく future 変数がコールバック関数に渡されます。future 変数に対して fetchOutputs を呼び出し、その出力を処理します。Future でエラーが発生すると、fetchOutputs によりエラーがスローされます。これをキャッチして処理できます。以下のコードはエラー ダイアログ ボックスを表示します。

afterEach(errorFuture, @handleError, 0, 'PassFuture',true);

function handleError (f)
try
    output = fetchOutputs(f);
    % Do something with the output
catch
    errordlg('Operation failed');
end
end

入力引数

すべて折りたたむ

Future。parallel.Future の配列として指定します。funtocall は、Future の要素が使用可能になるとそれぞれの要素に対して呼び出されます。Future の作成には、parfeval を使用できます。

futures の要素でエラーが発生した場合、funtocallfutures のその要素について評価されませんが、エラーが発生していない futures の他の要素について評価されます。エラーの発生した Future があるかどうかは、outputFutureError プロパティで確認できます。エラーがない場合、このプロパティは空の cell 配列です。エラーがある場合は、futures の Future と同じ数の cell を含む cell 配列になります。futures の対応する要素でエラーが発生した場合は cell にエラーが含まれますが、それ以外の場合は空になります。futures の要素をキャンセルすると、その要素でエラーが発生した場合と同じ動作が発生します。

例: future = parfeval(@rand,1,1000,1); afterEach(future,@max,1);

データ型: parallel.Future

実行する関数。futures の Future が使用可能になると、各 Future の出力引数に対して呼び出される関数として指定します。funtocall は、並列プール ワーカー上ではなく MATLAB® クライアント上で評価されます。

例: funtocall = @max

データ型: function handle

funtocall から返される出力数。整数として指定します。

例: afterEach(futures,@max,1)

データ型: scalar

funtocall への入力引数のタイプを特定するインジケーター。logical スカラーとして指定します。true に設定した場合、futures の各 Future が funtocall に渡されます。それ以外の場合は、futures の各 Future の出力引数が funtocall に渡されます。この引数はオプションで、既定の設定は false です。

このアプローチは、あらゆるエラー処理に使用できます。passFuturetrue に設定すると、afterEachfutures でエラーが発生した場合でもその各要素に対して funtocall を呼び出します。結果を抽出するには、funtocall への入力引数に対して fetchOutputs を呼び出さなければなりません。エラーの発生した Future がある場合、fetchOutputs によりエラーがスローされます。これをキャッチして処理できます。

例: afterEach(futures,@(f) disp(fetchOutputs(f)),0,'PassFuture',true)

データ型: logical scalar

出力引数

すべて折りたたむ

Future。parallel.Future として返されます。futures の Future が使用可能になると、それぞれについて funtocall を評価した結果を格納します。結果を抽出するには、fetchOutputsoutputFuture で呼び出します。

ヒント

  • afterEach は、parfevalparfevalOnAllafterAllafterEach,、またはこれらの組み合わせを含む配列から返されたすべての Future に使用します。たとえば、afterEach を使用して、別の afterAllafterEach の結果に対してさらに関数を自動的に呼び出します。afterEach は、Future が完了する前後に呼び出すことができます。

  • afterEach から返された Future の実行をキャンセルするには、それに対して cancel を使用します。キャンセルされた Future に対して afterEach を呼び出すと、afterEach は、その Future でエラーが発生した場合と同じように動作します。

R2018a で導入