2009-10-05 10 views
14

私はbashで非対話的にmatlabを呼び出し、その結果をMatlabの外で使用したいと思います。Matlabの開始メッセージを抑制する

私はbashの

$ matlab -nosplash -nodesktop -nodisplay -r test 
Warning: No window system found. Java option 'MWT' ignored 

         < M A T L A B (R) > 
       Copyright 1984-2008 The MathWorks, Inc. 
        Version 7.7.0.471 (R2008b) 
         September 17, 2008 


    To get started, type one of these: helpwin, helpdesk, or demo. 
    For product information, visit www.mathworks.com. 


ans = 

0.8147 0.9134 0.2785 0.9649 
0.9058 0.6324 0.5469 0.1576 
0.1270 0.0975 0.9575 0.9706 

で実行すると例えば、私はスクリプトtest.m

rand(3,4) 
quit 

を持っているが、それは、MATLABの開始メッセージを抑制し、のみなしでも結果を表示することは可能です"ans ="

注この例だけではなく、一般的な質問をしています。

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

+0

Octaveでは '-q'フラグを使うことができます。 – sffc

答えて

9

UNIXコマンド "tail + n"を使用して、最初のn行の出力を削除することができます。そのヘッダーは10行のように見えるので、これは削除されます。

$ matlab -nosplash -nodesktop -nodisplay -r test | tail +10 

(つまり「窓なしシステム」のような)警告が取り除かれますと、ヘッダサイズが起こる(およびそれらの警告は便利診断されている)何の警告に応じて異なりますので、これは、しかし、少し壊れやすいです。また、その警告はSTDOUTの代わりにSTDERRにある可能性がありますので、 "tail +9"が必要な場合があります。

より堅牢なアプローチは、fopen/fprintf/fcloseを使用して別のファイルに書き込むようにMatlabスクリプトを変更することです。こうすることで、Matlabのヘッダー、警告、エラーなどは、必要な書式設定された出力から分離されます。 "disp"出力を別のファイルハンドルに移動させるには、evalcを使用してそれをキャプチャすることができます。 outfileは、-rメッセージ内のtest()への引数と、ファイル名に組み込まれた$$ env変数(bashプロセスのPID)を使用してマルチプロセス環境での衝突を防ぐことができます。

function test(ppid) 
outfile = sprintf('outfile-%d.tmp', ppid); 
fh = fopen(outfile, 'w'); 
myvar = rand(3,4); 
str = evalc('disp(myvar)'); 
fprintf(fh, '%s', str); 
fclose(fh); 

bashから呼び出すには、この呼び出しフォームを使用します。 (ここではマイナーな構文の問題であってもよく、。私は、今のテストにUnixのボックスを持っていない)

% matlab -nosplash -nodisplay -r "test($$)" -logfile matlab-log-$$.tmp 

のは、あなたのbashのPIDは、今、あなたはOUTFILE-1234であなたの出力を持っている1234であるとしましょう。 MATLABはmatlab-log-1234.tmpにログインします。 pwdに依存したくない場合は、/ tmpに貼り付けてください。これを拡張して、単一のMATLAB呼び出しから複数の出力ファイルを作成し、複数のものを計算する必要がある場合は起動コストを節約できます。

+2

これは、 '-n'で' tail -n + 10'にしてはいけませんか? – elaRosca

+1

'tail'のバージョンによって異なります。 '-n'のない構文は古いものですが、私が働いているOS Xを含むいくつかの場所ではまだサポートされています。私は怠け者で慣れているので、私はそれを使用します。 '-n'を含めることで移植性が高まり、おそらくより読みやすくなります。 –

2

出力をファイルに保存し、そのファイルを読み込むことをおすすめします。このアプローチはやや複雑ですが、フォーマットが変わるなどして壊れにくくなります。 Matlabファイルを別のホスト言語に変換するために、Web上にたくさんのスクリプトがあります。

例:

A = randn(3, 2); 
save temp_output.mat A 
# Later, read temp_output.mat in whichever language you desire. 
2

ans =の表示を抑制するために、あなたはDISP機能を使用できます。その最初の警告メッセージを抑止するには

disp(rand(3,4)); 

を、あなたはにオプション-nojvmに追加してみてくださいすることができますそれが役立つかどうかを見てください。

他のすべてを抑制するには、同じ問題に対処するMathWorksニュースグループのスレッドからthis solutionを試すことができます。この

matlab -nodisplay <test.m &>matlab.output 

のようにMATLABを呼び出す

+1

-nojvmは起動メッセージを抑制しません。つまり、 " ..." – Tim

+0

@Tim:それはミスタイプでした。私はそれが警告メッセージに役立つかもしれないことを示唆することを意味しました。私はそれを修正します。 – gnovice

1

は(あなたが欲しいものを命名することができます)matlab.outputファイルに起動メッセージや他の表示された出力のすべてをダンプします。あなたは(ピーターの提案を以下)

csvwrite('temp_output.txt',A) 

または別の適切な出力機能を使用してファイルに必要な結果を保存test.mお持ちの場合は、このファイルを読み込むと進むことができます。そして、あなたは簡単にあなたが望む任意の方法(例えばセッド)を使用して、最初の数行を削除することができます

-logfile log   - Make a copy of any output to the command window 
         in file log. This includes all crash reports. 

11

-logfileコマンドラインオプションを使用してみてください。例:MATLABの起動時に

-wait  - MATLAB is started by a separate starter program 
      which normally launches MATLAB and then immediately 
      quits. Using the -wait option tells the starter 
      program not to quit until MATLAB has terminated. 
      This option is useful when you need to process the 
      the results from MATLAB in a script. The call to 
      MATLAB with this option will block the script from 
      continuing until the results are generated. 

詳細はこちらからも

matlab.exe -nosplash -nodesktop -nojvm -logfile out.log -r 'rand(3,3), exit' 
sed '1,5d' out.log 

あなたはそれが継続する前に実行を終了する必要があるスクリプトから実行している場合は、-waitオプションを使用しますオプションはhere、または実行可能な参照ページにあります。/Unix

+0

MATLABスタートアップオプションの詳細は、こちらをご覧ください:http://www.mathworks.com/access/helpdesk/help/techdoc/index.html?/access/helpdesk/help/techdoc/matlab_env/f8-4994.html –

関連する問題