Main Content

このページは前リリースの情報です。該当の英語のページはこのリリースで削除されています。

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 を使用して取得できます。fetchOutput は、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 を使用して計算をワーカーにオフロードすると、ワーカーがこれらの計算を実行中にすべてのユーザー インターフェイスが応答可能な状態になります。この例では、waitbar を使用して単純なユーザー インターフェイスを作成します。

  • それぞれの計算が完了するたびにユーザー インターフェイスを更新するには、afterEach を使用します。

  • すべての計算が完了した後にユーザー インターフェイスを更新するには、afterAll を使用します。

waitbar を使用して Figure ハンドル h を作成します。afterEach または afterAll を使用すると、関数 waitbar は Figure ハンドルを更新します。ハンドル オブジェクトの詳細については、ハンドル オブジェクトの動作を参照してください。

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

parfeval を使用して、乱数行列の固有値の実数部を計算します。parfeval は、並列プールが作成されていなければ、自動的に既定の基本設定で作成します。

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

afterEach を使用して、parfeval の各計算結果に対して自動的に関数を呼び出すことができます。各 future が完了するたびに、afterEach を使用して各出力配列内の最大値を計算します。

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

State プロパティを使用して、future のステータスを取得できます。f の future の State プロパティが "finished" である logical 配列を作成します。mean を使用して、終了した future の割合を計算します。次に、無名関数 updateWaitbar を作成します。関数は、h のウェイト バーの割合の長さを、終了した future の割合に変更します。

updateWaitbar = @(~) waitbar(mean({f.State} == "finished"),h);

maxFuture の各 future が完了するたびに、afterEachupdateWaitbar を使用してウェイト バーの割合の長さを更新します。すべての計算が完了したら、afterAlldelete を使用してウェイト バーを閉じます。

updateWaitbarFutures = afterEach(f,updateWaitbar,0);
afterAll(updateWaitbarFutures,@(~) delete(h),0);

すべての future が完了したら、afterAllhistogram を使用して maxFuture の結果のヒストグラムを表示します。

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 で導入