2012-04-10 12 views
10

私はこのMATLAB関数bashスクリプトでmatlabから戻り値を取得するには?

function [result] = matlab_test(param1, param2) 

disp(sprintf('param1 : %s', param1)); 
disp(sprintf('param2 : %s', param2)); 

result = 'hello matlab'; 

を持っていると私は

matlab -nodesktop -nosplash -nodisplay -r "try, A=matlab_test('test','matlab'); end; quit" 
echo $A 

のようにはbashスクリプトでこのMATLAB関数を呼び出すしたいと私は、この出力に

test 
matlab 
hello matlab 

私の要求をしたい場合はここにあります私のbashスクリプトでMatlabの戻り値を使用することが可能かどうかを調べ、それをパイプラインに渡すこともできます。私は自分のアプリケーションを小さなコンポーネント(ファイル)に分け、パイプライン/ paramsで通信したいだけです。要するに、私は自分のコード・アーキテクチャーを設定できるように、bashスクリプトでMatlabスクリプトをどのくらいラップできるかを見たいと思う。
私はこれを行うことができない場合、私は単にmatlabからの戻り値が必要な部分を一緒にmatlabスクリプトにバンドルします。

+0

改訂された質問に答えるために私の答えを編集しました。 – Sevenless

+0

戻り値が小さい整数の場合、簡単な解決策は、[exit(code) '](http://au.mathworks.com/help/matlab/)を使用して、Matlabプロセスの終了コードとして返すことです。 ref/exit.html)コマンドを使用します。 Windowsでこれを試すときは、 '' -wait'](http://au.mathworks.com/help/matlab/ref/matlabwindows.html)の 'matlab'へのコマンドライン引数を忘れないでください。 –

答えて

6

2つの質問があります。私はあなたのオペレーティングシステムに応じて2つ目のものが不可能になる(そして私の場合は絶対不可能かもしれない)理由を含めて、両方に答えて、問題に応じた回避策を提案します。

まず、このようなスクリプトを使用して、MATLABがシェルと対話するようにします。

#!/bin/sh 

cat <<EOF | matlab -nodesktop -nosplash -nodisplay 
A=matlab_test('$1','$2'); 
system(['export temp1=' A]); %doesn't work 
setenv('temp2',A); %also doesn't work, I'll explain why below 
exit 
EOF 
echo $temp1 
echo $temp2 

は出力が得られます。

[[email protected] ~]$ ./stack_ex test matlab 
Warning: No window system found. Java option 'MWT' ignored 

          < M A T L A B (R) > 
        Copyright 1984-2010 The MathWorks, Inc. 
       Version 7.12.0.635 (R2011a) 64-bit (glnxa64) 
           March 18, 2011 


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

>> param1 : test 
param2 : matlab 
>> >> >> 

だから、明確に環境変数を設定することの2つのバージョンが動作しません。これはあなたの2番目の質問につながります。

「エコー」に失敗した理由は、systemsetenvの両方が、Matlabが閉じられたときに閉じるシェルを作成することです。つまり、Matlabはシェルと呼ばれるシェルの外に環境変数を設定することはできません。

マイクロソフトのツールを使用しているin this postingで説明されているWindowsシステムの場合、この問題を回避する方法があります。また、hereも参照してください。

* nixシステムがMatlabから環境変数を設定するための回避策はないと思います。

ここでは、説明したのと同様の操作を行う方法を示します。

私はあなたが実際にしたいことではないエコーの使用を前提としています。むしろ、環境変数に格納されている文字列出力を使用して、シェル内のコマンドやスクリプトを使用する場合に使用すると思います。一つの可能​​な回避策は、次のようになります。

#!/bin/sh 

cat <<EOF | matlab -nodesktop -nosplash -nodisplay 
A=matlab_test('$1','$2'); 
setenv('temp1',A); %doesn't work 
[a b] = system(['echo ' '$' 'temp1']) 
exit 
EOF 

出力与える: [XXXXXX @計算-0から138までが〜] $ ./stack_ex_3テストMATLAB 警告:見つかりませんでしたウィンドウシステムを。 Javaのオプション「MWTは」このコマンドecho $temp1setenvとTEMP1により作成されたサブシェルで評価されたことを示し、それに割り当てられた値を保持している

      < M A T L A B (R) > 
        Copyright 1984-2010 The MathWorks, Inc. 
       Version 7.12.0.635 (R2011a) 64-bit (glnxa64) 
           March 18, 2011 


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

>> param1 : test 
param2 : matlab 
>> >> 
a = 

    0 


b = 

hello matlab 

を無視しました。このシェルの呼び出しの結果は、b(aは成功を示す0を保持する)に格納されます。シェルで実行したいことの全てをシステムコマンドで渡すことができるので、サブシェルで実行することが考えられます。私たちはこのアプローチの完全な評価をするために、あなたの問題の詳細をもっと知る必要があります。

編集とフォロー**********************

MATLABと私は考えることができるのbashをラップに最も近いものは、次のトリックです。パイプを使用して、次のとmyresult.outにMATLABスクリプトからの出力ができます。

#!/bin/sh 

cat <<EOF | matlab -nodesktop -nosplash -nodisplay /> myresult.out 
A=matlab_test('$1','$2'); 
disp(['grepMe ' A]) 
exit 
EOF 

パイプを使用し、その後、パイプはsedのために、myresult.outからgrepMe行をgrepして、必要な出力ラインの一部のみを選択することができますあなたのスクリプトの残りの部分にそれは私があなたがしようとしているものに到達できると思うほど近いです。

+0

私の要件の詳細については、私の質問の更新を参照してください。あなたの答えはいいですが、私はより洗練された方法bashスクリプトにその価値を送信する必要があります。 –

2

ここでは2つのことをしようとしています。まず、MATLABプログラムの出力をシェルに表示します。次に、シェルに変数を割り当てます。私はこれを試したとき

、私はMATLABはそのオープニングメッセージをすべて標準出力の上に書くとことがわかったので、私はやってしまった:

mkfifo ~/matlab_output 
matlab ... > /dev/null & cat ~/matlab_output 

、その後、MathWorks社のMATLABの内側、とsprintfを置き換える:

f = fopen('~/matlab_output', 'w'); 
fprintf(f, 'param1 : %s', param1); 
fclose(f); 

これは最初の要件の1つの解決策です(普通のファイルに書き込んだ後にファイルをcatできますが、&&を使用しなければならないため、Matlabが完全に終了するまで出力が表示されません)。あなたが持っている2番目の問題 - MATLABで "A = result"を実行し、シェルで "$ A"をエコーすることができることはより困難です。

mkfifo ~/matlab_commands 
mkfifo ~/matlab_output 
matlab ... > /dev/null & cat ~/matlab_output & eval $(cat ~/matlab_commands) 

とMATLABで:あなたのような何かができる

f2 = fopen('~/matlab_commands', 'w'); 
fprintf(f2, 'A=%s', double2str(results)); 
fclose(f2); 

が、私は実際にこれがどのように動作するかよくわかりません。

2

ここ数日間、これについて考えていて、何かを考えただけです。 MATLABクローンの1つを#として使用することができます。スクリプトインタープリタ。これの私の選択は、Octaveのようにです:

#! /usr/bin/octave -qf 
A=matlab_test('test','matlab'); 
printf(A) 

printfはSTDOUTに値を置き、そこからパイプすることができます。

[email protected][~]$ ./oshelltest 
param1 : test 
param2 : matlab 
hello matlab 
[email protected][~]$ ./oshelltest | grep hello 
hello matlab 

は今、Octaveは正確 MATLABと同じではありませんが、それはあなたのニーズに多分十分な、近いです。また、無料であるという利点もあります。

関連する問題