11

このmatlab関数がある場合

function [result] = matlab_test(param1, param2)

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

result = 'hello matlab';

そして、このmatlab関数をbashスクリプトで次のように呼び出したい

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

そして私はこの出力が欲しい

test
matlab
hello matlab

ここでの私の要件は、Matlabからの戻り値をbashスクリプトで使用できるかどうかを確認し、それをパイプラインに渡すことです。アプリケーションを小さなコンポーネント(ファイル)に分割し、パイプライン/パラメーターを介して通信したいだけです。つまり、コードアーキテクチャを設定できるように、Matlabスクリプトをbashスクリプトでどこまでラップできるかを確認したいと思います。
これができない場合は、matlabからの戻り値が必要な部分をmatlabスクリプトにバンドルするだけです。

4

3 に答える 3

7

あなたは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

出力を与えます:

[XXXXXX@compute-0-138 ~]$ ./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 番目の質問につながります。

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

この投稿で説明されている Windows システムには、Microsoft のツールを使用する回避策があります。ここ にも記載されています。

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

これは、あなたが説明したものと同様のことを行う方法です。

echo の使用は、実際にやりたいことではないと思います。むしろ、環境変数に格納された文字列出力を使用して、シェル内のコマンドまたはスクリプトでさらに作業を行うことをお勧めします。考えられる回避策の 1 つは、次のとおりです。

#!/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@compute-0-138 ~]$ ./stack_ex_3 test matlab 警告: ウィンドウ システムが見つかりません。Java オプション 'MWT' は無視されました

                            < 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

echo $temp1これは、によって作成されたサブシェルでコマンドが評価されsetenv、temp1 に割り当てられた値が保持されていることを示しています。このシェルへの呼び出しの結果は、b に格納されます (a は成功を示す 0 を保持します)。サブシェルで実行されるように、システムコマンドを介してシェルで実行したいことのすべてを渡すことができると考えられます。ただし、このアプローチを完全に評価するには、問題の詳細を知る必要があります。

編集とフォローアップ **********************

私が考えることができる Matlab と bash のラッピングに最も近いのは、次のトリックです。Matlab スクリプトからの出力をmyresult.out次のようにパイプすることができます。

#!/bin/sh 

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

grepMeから行をgrepし、myresult.outsedにパイプし、必要な出力行の部分のみを選択してから、スクリプトの残りの部分にパイプします。それは、あなたがやろうとしていることにあなたが到達できると私が思うのと同じくらい近いです.

于 2012-04-10T23:13:26.430 に答える
3

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

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

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

matteson@mauler[~]$ ./oshelltest
param1 : test
param2 : matlab
hello matlab
matteson@mauler[~]$ ./oshelltest | grep hello
hello matlab

現在、OctaveはMATLABとまったく同じではありませんが、近いので、おそらくあなたのニーズには十分です。また、無料であるという利点もあります。

于 2012-04-16T00:57:46.483 に答える
2

ここでやろうとしていることは 2 つあります。まず、Matlab プログラムの出力をシェルに表示します。次に、シェルで変数を割り当てます。

これを試してみたところ、Matlab が標準出力全体に開始メッセージを書き込むことがわかったので、最終的には次のようにしました。

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

次に、matlab 内で次のように置き換えsprintfます。

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

これは、最初の要件に対する 1 つの解決策です (通常のファイルに書き込み、後でそのファイルを cat することもできますが&&、そのために使用する必要があるため、Matlab が完全に終了するまで出力が表示されません)。あなたが持っている2番目の問題-matlabで「A = result」を実行し、シェルで「echo $ 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);

しかし、これがどれほどうまく機能するかはよくわかりません。

于 2012-04-10T08:45:27.750 に答える