Main Content

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

afterAll

すべての parallel.Future の完了後に呼び出す関数を指定

説明

outputFuture = afterAll(futures,funtocall,nout) は、futures のすべての Future が完了した後に、それらの出力引数について自動的に funtocall を評価し、outputFuture を返して結果を格納します。afterAll は、すべての Future の出力引数の垂直連結について funtocall を評価します。Future の要素の出力引数の数が異なる場合、afterAll は最小数を使用し、最後の出力引数を無視します。afterAll は、出力引数 nout を指定して funtocall を呼び出します。

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

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

すべて折りたたむ

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

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

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

ベクトルの作成後、これらすべての最大要素を表示します。afterAll は、すべての Future が使用可能になったら、これらの出力の結合に対して関数ハンドルを実行します。

afterAll(f, @(r) disp(max(r)), 0);
    0.9998

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

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

errorFuture = parfeval( @(n) randn(n), 0, 0.5);
Starting parallel pool (parpool) using the 'Local' profile ...
connected to 4 workers.
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 に対して afterAll を使用した場合、コールバック関数は評価されません。以下のコードでは、Future のエラーのため、msgbox が実行されません。

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

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

afterAll(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 の配列として指定します。すべての Future の要素が準備完了になると、すべての要素の出力の結合に対して funtocall が呼び出されます。Future の作成には、parfeval を使用できます。

futures のいずれかの要素でエラーが発生した場合、funtocall は呼び出されず、outputFuture はエラーで完了します。エラーが発生して Future が完了したかどうかは、outputFutureError プロパティで確認できます。futures の要素をキャンセルすると、その要素でエラーが発生した場合と同じ動作が発生します。

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

データ型: parallel.Future

実行する関数。futures 内のすべての future が完了したときに、すべての future の結合された出力引数について呼び出される関数として指定します。funtocall は、並列プール ワーカー上ではなく MATLAB® クライアント上で評価されます。

例: funtocall = @max

データ型: function handle

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

例: afterAll(futures,@max,1)

データ型: scalar

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

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

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

データ型: logical scalar

出力引数

すべて折りたたむ

Future。parallel.Future として返されます。futures のすべての Future が使用可能になると、それらすべての出力引数の結合に対して funtocall を評価した結果を格納します。

結果を抽出するには、fetchOutputsoutputFuture で呼び出します。

outputFutures = afterAll(futures,funtocall,nout);
[out1,out2,...,outM] = fetchOutputs(outputFutures);
これは futures の出力を取得した後で funtocall を呼び出すのと同等ですが、afterAllfutures 内のすべての要素が完了したときに funtocall を自動的に呼び出します。
[tmp1,tmp2,...,tmpN] = fetchOutputs(futures);
[out1,out2,...,outM] = funtocall(tmp1,tmp2,...tmpN)
Nfutures からの出力数で、M は入力引数 nout を使用して afterAll に指定された出力数です。

ヒント

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

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

R2018a で導入