0

以下のWebサイトを利用して、Matlabをバックグラウンドで実行することができました。

http://www.stat.osu.edu/computer-support/programming/background-jobs

私はループを実行しています:

for ((i = 1; i <= 5; i++)); do
    echo $i>i.txt;
    matlab -nodesktop -nodisplay <script.m &> dummy.out &
done

スクリプトには一部があります:

fid=fopen( 'a:\folder\i.txt');'];
iter=str2double(fgets(fid))
myfunction(iter,a,b,c)

myfunction.mの関数行は

myfunction(num,a,b,c)

この関数は、「num」の値に応じて変化する名前のファイルを保存します

つまり、出力は次のようになります。1番目のコマンドの場合はmyfile1.mat、2番目のコマンドの場合はmyfile2など。

ループなしでコマンドを実行しているとき

echo 1>i.txt;
matlab -nodesktop -nodisplay <script.m &> dummy.out &
echo 2>i.txt;
matlab -nodesktop -nodisplay <script.m &> dummy.out &

etc...

問題はなく、出力は良好です。

ループを実行しているとき、取得するファイルはmyfile5.matだけです。

入力がmyfunction(i1、a、b、c)、myfunction(i2、a、b、c)になるようにコードを変更しましたが、結果は同じままです。

保存部分は関数の最後にあるので(長時間実行されます)、すべての関数の「num」は5です(ループは計算よりもはるかに速く終了します)。

何か案は?tnx

4

3 に答える 3

2

バックグラウンドモードで実行されるため、同じファイルでジョブを実行すると、最初にファイルに「1」が含まれ、その後に「2」、「3」、「4」、「5」が含まれ、その後にのみ最初のスクリプトが評価を開始します(ファイルには「1」ではなく「5」が含まれています)。

あなたは今、ファイルを介して関数にパラメータを渡そうとしていますよね?パラメータを関数自体に渡してみませんか?ここで説明するように、Matlabで多数の関数を並行して(バックグラウンドモードで)実行します。例: http: //www.mathworks.ch/matlabcentral/newsreader/view_thread/166876

于 2012-05-30T10:41:24.343 に答える
2

問題は、MATLAB呼び出し後のアンパサンド(&)記号です。ループの実行が開始され、値1がi.txtに入れられ、MATLABプロセスがフォークされてから、ループが再び実行され、値2が入れられます。 i.txt、次に別のMATLABプロセスをフォークします。現在、MATLABは開始に時間がかかります。このループは、MATLAB呼び出しが終了するのを待たないため、非常に高速です。したがって、最初のMATLABインスタンスが最終的に終了するまでに、ループは長く終了し、i.txtの値は次のようになります。すべての呼び出しに対して5。

短いバージョン:&記号を削除します:)

これにより、MATLABが実行され、ループを続行する前に終了します。

于 2012-05-30T16:52:15.417 に答える
0

私は問題の解決策を見つけました、

非常に簡単です。変数を環境にエクスポートするだけで、MATLABスクリプトで変数を読み取ることができます。

for ((i = 1; i <= 5; i++)); do
     export i
     matlab -nodesktop -nodisplay <script.m &> dummy.out &
done

そしてscript.mで

iter=str2double(getenv('i'))
myfunction(iter,a,b,c)

うまくいきます!

于 2012-06-01T02:42:25.607 に答える