2017-03-14 15 views
1

MATLABで関数を非ブロック化する方法はありますか?関数をMATLABで非ブロック化する方法は?

は、例えばプログラム

for t = 0 : 1 : 1000 
    if mod(t, 100) == 0 
     foo(); 
    end 
end 

はそれがfoo() 100サイクル毎と呼ばれ、foo()は約50サイクルを費やしています。

バックグラウンドタスクでfoo()に電話し、完了すると特定のコールバック機能を呼び出すことができます。これをMATLABに実装する方法はありますか?

+1

いいえ、AFAIK Parallel Processing Toolboxをお持ちで、parfeval関数を使用している場合を除き、AFAIKはありません。あなたがParallel Processing Toolboxを手に入れておらず、非同期の処理をしたい場合は、間違った言語を使用しています。あなたの唯一の希望は、 'foo()'がJavaをいくつか呼び出し、いくつかのスレッドや他のコードからJaveコードを生成させることです。あるいは、Python(numpyとscipyは非常にMatLab-esqueに見えるようになります)を考えてから、適切な(!)プログラミング言語機能にアクセスできます。 – bazza

+0

@bazza私はそれが確かに答えだと信じています。そのように投稿することを検討してください。 –

+0

Parallel Computing Toolboxの@bazza 'parfeval'は' foo() 'の後にコールバック関数が完了していないことを除いて、私の要求を満たしています。 –

答えて

1

あなたが「バッチ」コマンドを(私はあなたが並列コンピューティングツールボックスを持っている必要があります考えて)使用する必要がありますMathWorks社のMATLABでのマルチスレッド化を行うには、ここに

は一例です:

私はMathWorks社のMATLABでスクリプトを実行したいです長い時間

スクリプトの例を取る:

for i=1:1e8 
    A(i)=sin(i*2*pi/1e8); 
end 

iが "ダ" として、このスクリプトを保存!その後、バッチモードでそれを実行するための

私はMathWorks社のMATLABでこのコードを書いた:

job=batch("da") 

をジョブはバッチモードで実行し、tはあなたができた仕事を終えた後、結果を取得すると同時に をあなたのMATLABを使用することができます単に書く:

load(job,'A') 

をし、その結果、配列Aは、ワークスペースになります

あなたが開くから「ジョブGUIを監視する」ことができホーム>環境>パラレル>モニターの仕事 、最終的には、単純なコードの下でジョブを削除できます。

delete(job) 

をバッチ処理のための機能をロードするためには、単にこのステートメントを使用することができます

j=batch(fcn, N, {x1,x2,...,xn}) 

場所fcnは関数名、Nは出力配列の数、x1、... xnは関数入力配列です。

関連する問題