2017-06-14 69 views
1

我有一個Matlab .m文件,我通常以交互方式運行。我想在一夜之間運行一些工作,而不需要重新編寫.m文件來刪除交互式查詢以進行輸入。我曾經可以通過從操作系統的命令行運行批處理文件來使用Fortran或C或VB可執行文件來執行此操作。這可能與Matlab? (另外,我沒有Matlab的編譯器,但我可以有Matlab的開全時間。)用批處理調用運行交互式Matlab.m文件

骷髏計劃:

Input variable1 from keyboard; 
Input variable2 from keyboard; 
Long calculation; 
Save results to file; 
Stop 

但是,如果我做一個「批處理」 .m文件運行程序,像這樣:

Program 
0.2 
0.47 
Program 
1.2 
2.4 

然後程序只是坐在那裏永遠等待我的鍵盤輸入。有沒有辦法運行程序,以便從調用.m文件獲取其交互式輸入?

+0

我有兩個解決方法在下面,但仍然喜歡答案,如果存在。 – dmm

+0

注意:我發現在Matlab v5中可以分別使用0和1作爲鍵盤和屏幕的文件標識符,分別使用fscanf和fprintf。所以我沒有瘋狂;我曾經能夠做我想問的事情。 – dmm

+0

另請注意:我正在使用Windows操作系統(7)。 – dmm

回答

0

你正在使用什麼環境/操作系統?你指的是一個批處理文件,導致你認爲你在Windows中工作。如果您在Linux中工作,則可以使用echo命令並將結果傳送到您的程序中。例如:

#my_bash_script.sh 
echo "0.2 
0.47 
" | Program 

也許你可以做類似的事情,如果你正在使用Windows批處理文件。看看這是一個資源: https://ss64.com/nt/syntax-redirection.html

+0

這不需要程序是可執行文件嗎? – dmm

+0

不,它只是要求Python在你的道路上。你可以在命令行上用「python」調用你的腳本,或者在你的bash腳本的第一行中包含shebang(#!/ usr/bin/python)。 –

0

這是一個解決方法,而不是一個答案,但它太長的評論。經過一段時間的研究,我不認爲Matlab可以做什麼問題的要求。 (不是沒有將Matlab代碼編譯成可執行文件)。我通過編寫一個函數(稱爲Meta)來解決這個問題,該函數讀取響應的整個「批處理」文件並將其作爲字符串數組返回。我爲程序提供了兩個額外的輸入參數:交互式/批量運行標誌(FlagBatch)和批處理文件名(BatchName)的字符串。如果FlagBatch爲1,程序使用Meta讀取BatchName並生成ResponseArray,用於響應來自Program的任何請求。 Kludgey,但它起作用,對程序進行最少的重新編程。 (當然,我必須能夠訪問程序的代碼,但是如果我只有其他人的可執行文件,那麼我就不會有這個問題了!)

0

另一個解決方法。定義我的輸入(見下文),並用它來替代輸入。正如在我的另一個解決方法中,您爲程序提供了兩個額外的輸入參數:交互式/批處理運行標誌(FlagBatch)和批處理文件名(BatchName)的字符串。也有

if FlagBatch==1, fid=open(BatchName); end 

附近的程序頂部。當你有很多分散在程序(和各種子程序/函數)的輸入語句時,這種方法很好。

function A=myinput(fileID,prompt,formatSpec,sizeA) 
% A=myinput(fileID,prompt,formatSpec); 
% Function myinput will read from either stdin (keyboard) or from a file, 
% allowing programs' inputs to be entered interactively or from a file. 
% Use it instead of Matlab's built-in functions input and fscanf. 
% fileID = file ID (fid) of the opened file, or 0 for keyboard input. 
% prompt = the prompt string (not used for file input) 
% formatSpec = string containing Matlab format spec; 
%    not used for keyboard input 
% sizeA = size of A; basically specifies how many times to use formatSpec; 
%   not used for keyboard input 
% 
% Example Uses in Program (where fid would have been set earlier): 
% NumOrcs=myinput(fid,'Enter # of orcs','%i',1); 
% MapFile=myinput(fid,'Enter filename for LotR map','s',1); 
% [Sgimli,Slegolas]=myinput(fid,'Strengths of Gimli and Legolas?','%g',2); 
% 

if fileID==0 
    if formatSpec=='%s' 
     A=input(prompt,'s'); 
    else 
     A=input(prompt); 
    end 
else 
    A = fscanf(fileID,formatSpec, sizeA); 
end 
return