2013-05-27 61 views
2

我需要一種方法來在另一個腳本內執行matlab腳本。棘手的部分是,第一個腳本是一個while循環,每60秒輪換一次新作業。如果找到一份工作(由我創建),則應調用main.m文件。現在,問題是我希望能夠在while循環已經運行時修改main.m和所有其他函數。循環看起來像這樣:Matlab:通過腳本模擬命令窗口輸入

while run 
    - pause 60 seconds 
    - get jobs form text file on network drive 
    - run main(jobID) 
    - save result on network drive 
end 

我認爲eval命令會做的伎倆。但事實並非如此。我認爲Matlab編譯所有可以在運行期間調用的函數,只要我開始我的while循環。從那時起,我不能在沒有重啓while循環的情況下改變任何東西。 (我可以改變它,但Matlab忽略所有更改)。

有沒有辦法解決這個問題?我以爲有一種在命令窗口內執行命令的方法,就好像用戶輸入了它一樣。但我不記得。

+0

您是否嘗試過使用斷點並按F10執行腳本以逐行進行? –

+0

這不會令人滿意,因爲我想讓matlab用這個while循環「等待」我,然後選擇一個作業,執行,保存文件並返回while循環。原因是,我想使用大約20個工作站,但我沒有任何訪問真正的集羣。所以我很喜歡把工作放在那裏,第一臺免費的電腦重複了while循環。 – Cat

+0

你可以添加mex擴展到你的服務器嗎?你可以用「popen」啓動另一個Matlab實例並使用它的命令窗口。標準庫沒有「popen」,只有在C擴展幫助下才可用 –

回答

1

Amro的解決方案rehash完美運作。 Matlab檢測m文件中的變化,即使它已經在運行腳本!

0

我想你或許可以用timer這個對象做你想做的事。

首先創建一個main.m文件的功能來定義和初始化定時器:

function main 

% Create timer that calls the sub-function checkmfiles every 60 seconds 
t = timer('TimerFcn', @checkmfiles, 'Period', 60, 'ExecutionMode', 'fixedRate'); 
start(t); 

function checkmfiles(obj,events) 
% Just a dummy function, you'll need to expand it to fit your needs 
if exist(f1) == 2 
    disp('''f1.m'' found.'); 
    eval('f1'); 
else 
    disp('No file found.'); 
end 

上面的例子假設f1.m最初並不存在。您可以運行main.m,然後創建任意f1.m(示例假定該函數不接受任何輸入),然後由定時器回調運行。這個方法還有另外一個好處,就是它在計時器運行時不會佔用你的Matlab會話。

+0

謝謝,好處可能真的派上用場。它現在與rehash命令一起工作,但使用暫停(..)我總是忙於matlab。這並不妨礙我強硬,因爲它不使用CPU。謝謝強硬。 – Cat