2011-01-25 272 views
16

長時間実行しているスクリプトをMatlabに書きます。Matlabで実行中のスクリプトを停止する方法

tic; 
d = rand(5000); 
[a,b,c] = svd(d); 
toc; 

これは永久に実行されているようです。私はエディタウィンドウでF5キーを押します。だから私はMatlabコンソールで停止するためにC-Breakを押すことはできません。

私はちょうどスクリプトを停止する方法を知りたいです。私は現在、MATLABを殺すタスクマネージャを使用しています。これは本当にばかげています。

ありがとうございました。

答えて

8

Matlab help says- 長時間実行するMファイル、または長時間実行する組み込み関数やMEXファイルを呼び出す場合、Ctrl + Cは実行を効果的に停止するとは限りません。通常、これはUNIX [1]プラットフォームではなくMicrosoft Windowsプラットフォームで発生します。この問題が発生した場合は、例えば大きなループ内で、Mファイルにdrawnow、pause、getframe関数を含めることにより、MATLABの実行を中断させることができます。 -nodesktopオプションを指定してMATLABを起動した場合、Ctrl + Cの応答性が低下する可能性があることに注意してください。

だから、私はオプションがないと思います。これは複雑な多くのMATLAB関数で起こります。私たちは待たなければいけませんか、それらを使わないでください!

4

svdなどのmex実装関数を実行しているときにMATLABがCtrl-Cに応答しません。また、MATLABが大きなチャンクを割り当てているときは、応答しません。良い方法は、少量のデータに対して常に関数を実行し、すべてのテストパスが実際の規模で実行するときです。時間が問題となる場合は、コードの各セグメントが実行されている時間とその大まかな時間の複雑さを分析する必要があります。

-3

に追加するには:あなたは、集中やデッドロックの可能性、すなわちとループ内の時間のチェックを挿入することができ

。このセクション内

if (toc > timeRequiredToBreakOff)  % time conditional break off 
     return; 
     % other options may be:       
     % 1. display intermediate values with pause; 
     % 2. exit;       % in some cases, extreme : kill/ quit matlab 
end 
2

は、複数のMATLABセッションを有する検討

: 
section_toc_conditionalBreakOff; 
: 

。あなたが知っていることを知っているものを実行するためのメインセッションウィンドウ(すべての色、ファイルマネージャ、コマンド履歴、作業領域、エディタなど)を保つ。あなたには、いくつかのパラメータを変更し、別のセッションで実行され、何が起こるかを予測していなかったので、特異行列:あなたがで実験している

スタッフは、あなたがODEスイートをいじりしていて、警告の多くを得ると言う

dos('matlab -automation -r &') 

Matlab全体を再起動しなくても、それを強制終了することができます。

1

私が採用した解決策の1つは、Javaコードで使用するためですが、概念はmexFunctionsと同じですが、FutureValueを返してからFutureValue.finished()を返します。実際のコードは別のスレッド/プロセスで実行されます。 tryをラップして、その周りをキャッチし、catchブロックのFutureValue.cancel()が私に役立ちます。

mex関数の場合、必要なすべてのデータ(ネイティブスレッドハンドラ、完了のためのブールなど)を持つs​​truct /オブジェクトを指すポインタ(intとして)を返す必要があります。組み込みのmexFunctionの場合、あなたのmexFunctionは、おそらく別のスレッドでそのmexFunctionを呼び出す必要があります。 Mex関数は結局のところDLL /共有オブジェクトです。

擬似コード

FV = mexLongProcessInAnotherThread(); 
try 
    while ~mexIsDone(FV); 
    java.lang.Thread.sleep(100); %pause has a memory leak 
    drawnow; %allow stdout/err from mex to display in command window 
    end 
catch 
    mexCancel(FV); 
end 
+0

これは私の必要とするもののようです。しかし、この関数はmexCancelと呼ばれ、どのように見えますか? – patrik

+0

@patrikそれはあなたの長いプロセスがどのように見えるかによってまったく異なります。本質的には、cancel、isdone、およびlongprocessは、一緒に動作するようにcで書かれ、dllにエクスポートされ、そしてそれらの関数を呼び出すために書かれたmex-functionsが必要です。それは簡単でも清潔でもなく、一般的なコードになることもありません。 – KitsuneYMG

+0

答えをありがとう。これは落胆のようですが、とにかく、これが達成されるならば、確かに美しい解決策です。 – patrik

0

あなたがLinux上でMATLABを実行している場合、あなたはLinuxのconsuleにコマンドにより、MATLABを終了することができます。 最初のあなたは、このコードによって、MATLABのPID番号を見つける必要があります:

トップ

その後、MATLABを殺すためにこのコードを使用することができます:

例を殺す: CTRL場合は58056

5

を殺しますあなたのスクリプトが長すぎる/複雑であるため、+ cはすぐに応答しません。

breakコマンドは、matlabが深いスクリプトのいくつかを実行しているときには実行されず、バッファ内にctrlシーケンスが記録されないか、バッファをクリアする直前または直後にバッファをクリアしますコード。どちらの場合でも、matlabがスクリプトをより多く実行するために戻ると、あなたはctrl + cを保持して終了していることを認識します。

長く実行されているプログラムの場合、私は通常、状態の​​更新を提供するための良い場所を見つけようとしていますが、私はいつもticとtocを使って時間を測定しています。私がやっている内容に応じて、私は本当に長い実行中のプログラムのために...

を実行時、セグメント時間、平均のいくつかの種類などを使用することができます、私はこれは http://www.mathworks.com/matlabcentral/fileexchange/16649-send-text-message-to-cell-phone/content/send_text_message.m

非常に有用であることが判明したが、それ彼らはこれのためにいくつかのより新しい機能を持っているように見えます。

1

タスクマネージャーについて言及して以来、Windowsを使用していると思います。あなたが実行中のプログラムを終了すると同時に、エディタを終了に反対されていない場合は、エディタでスクリプトを実行していると仮定すると、処理を終了するキーボードショートカットは次のとおりです。

Altキー + F4

(私は同時に、キーボードの 'Altキー' と 'F4' キーを押す意味れる。)また

、他の回答で述べたように、

Ctrlキー + C

も有効ですが、エディタを終了しません。

関連する問題