2012-05-30 42 views
0

我設法與下面的網站的幫助下在後臺運行Matlab的:運行循環利用Matlab的背景BASH#命令3

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」

含義的值更改的名稱的文件時,輸出將是:myfile1.mat爲第一命令,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

+1

嘗試在循環內調用matlab後放置一個'sleep 1',我認爲你的診斷是正確的。祝你好運。 – shellter

+0

@shellter,tnx,我在matlab調用之前和之後嘗試了10次睡眠,它不夠好,它不是一個好的解決方案,因爲函數的工作持續時間因呼叫而異,還有其他含義? – jarhead

回答

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) 

作品不錯!

2

問題是你運行作業時使用相同的文件,因爲它運行在後臺模式下,首先文件包含「1」,之後是「2」,「3」,「4」,「5」並且只有在第一個腳本開始評估之後(並且在文件中已經看到「5」而不是「1」)。

你現在正在嘗試通過文件傳遞參數給函數,對嗎?我只是想知道,爲什麼不把參數傳遞給函數本身?在Matlab中並行運行多個函數(在背景模式下),例如:http://www.mathworks.ch/matlabcentral/newsreader/view_thread/166876

+0

迭代次數可以增加,比方說一百,你會如何建議在上面的代碼中暗示這種方法? tnx – jarhead

+0

您可以在循環中創建後臺工作人員。只需創建'funList'作爲相同函數的列表,但'dataList = {1,2,...,100}',並使用'matlabpool open 100'。 –

2

問題是MATLAB調用之後的符號(&) - 發生了什麼是循環開始運行,將值1轉換爲i.txt,然後分叉一個MATLAB程序,然後循環再次運行,把值2放入i.txt,然後分叉另一個 MATLAB進程等等。現在MATLAB需要一段時間才能開始,而且這個循環非常快,因爲它沒有等待MATLAB調用完成,所以當第一個MATLAB實例最終完成時,循環很長時間並且i.txt中的值是5爲所有電話。

短版:刪除&符號:)

這將使MATLAB運行,並與循環繼續之前完成。

+0

tnx用於診斷。我會但循環遠遠超過5,並且畢竟進程在後臺我需要連接到其他服務器並運行相同的事情。你有另一種解決方案嗎? – jarhead

+2

研究旨在支持大規模多處理管理的系統,Hadoop是其中之一,還有許多其他的。您將無法一次在任何PC上運行100個Matlab會話,例如我知道的硬件,這是根據您迄今爲止提供的代碼會發生的情況。祝你好運。 – shellter

+2

您可以直接傳遞MATLAB參數,或以不同的方式命名輸入文件,並將文件名作爲參數傳遞,或者您可以製作目錄,在每個文件中放入一個i.txt,並在每個循環中cd到該目錄並啓動MATLAB在那裏。我同意@shellter,一臺PC不能處理100個MATLAB實例。它只會拖延你的系統,並像瘋了似的。 – Ansari