23

如何將命令行參數傳遞給在Linux/UNIX上運行的獨立MATLAB可執行文件 ?如何將命令行參數傳遞給在Linux/Unix上運行的獨立MATLAB可執行文件?

我需要編譯我的MATLAB腳本作爲一個獨立的文件,可以在沒有MATLAB存在的機器上運行。它需要能夠在類似於C的argv[]的方式,在你做以下工作:

命令行:

myfile argument1.txt argument2.txt 

其中參數1和2是輸入和輸出文件。

確切的語法並不重要,但它應該像argv[]一樣工作。什麼是可以做到這一點的功能?


我的意思是,我有MATLAB我的電腦上,但我需要可在Unix系統,而無需MATLAB在這些計算機上(這是一個簇,只有擁有MATLAB一個節點上運行一個獨立的可執行文件)。我需要找到一種方法來製作varargin函數,而不需要在運行程序的計算機上安裝MATLAB。如果我能告訴MATLAB將MATLAB庫放入每個可執行文件中,那沒關係,只要它是一個完整的獨立包。

回答

2

你不能在沒有MATLAB的計算機上運行MATLAB。您可以安裝免費安裝的MCR(MATLAB Component Runtime),並運行MATLAB程序。要構建「獨立」可執行文件,您還需要MATLAB編譯器。

一旦你有了。 MATLAB有你需要的所有功能來處理命令行參數。

20

MATLAB網站有一個 worked-through example說明如何編譯一個簡單的應用程序以及如何將它部署到另一臺計算機上。實質上,您需要將MATLAB編譯器運行時與您的應用程序一起安裝;運行時的安裝程序 應該已經存在於您的MATLAB編譯器 安裝中。

要通過命令行參數到MATLAB可執行,可以定義在可執行一個 單個MATLAB函數:所述參數給 函數從命令行參數取(第一個命令行參數是第一個參數, 等等)。

例如,創建一個文件echo.m具有以下 內容:

function exitcode = echo(a, b) 

display(a); 
display(b); 

exitcode = 0; 

然後,您可以編譯該文件,並運行echo 1 2 3它,它 將打印a=1 b=2

需要注意的是,在命令行參數拍攝時,他們 傳遞給函數的字符串,所以你需要使用str2num功能將它們轉換爲數字 。例如:

function rc = display_product(a, b) 

a = str2num(a); 
b = str2num(b); 

display(a*b); 

rc = 0; 
+0

返回的值是什麼? – guilhermecgs 2013-10-10 17:16:32

1

我有同樣的問題,並尋找一個通用的解決方案,在一個腳本,參數是作爲字符串傳遞的問題,而是需要作爲標量或向量。 假設你有以下功能

function myfunc(arg1, arg2, varargs) 
end 

,你也許希望能這樣稱呼它

myfunc(1, [1 2 3], 'optional1', 2) 

,也喜歡

myfunc('1', '[1 2 3]', 'optional1', '2') 

,這樣就可以編譯和使用它在命令行上就像

myfunc 1 '[1 2 3]' optional1 2 

對於這一點,我寫了下面的功能:

function r=evalArguments(parser, arguments) 
    % Evaluates parsed arguments' values. 
    % Given a parser containing parsed arguments, all string values of the 
    % arguments specified by parameter "arguments" are evaluated 
    % and the complete results is returned in a new struct. 

    r = parser.Results; 
    for j=1:length(arguments) 
     argValue = r.(arguments{j}); 
     if ischar(argValue) 
      r.(arguments{j}) = eval(argValue); 
     end 
    end 
end 

然後我可以使用inputParsermyfunc這樣的:

p = inputParser; 
p.addRequired('arg1'); 
p.addRequired('arg2'); 
p.addParameter('optional1', 0); 
p.parse(arg1, arg2, varargin{:}); 
nonStringArguments = {'arg1', 'arg2', 'optional1'}; 
args = evalArguments(p, nonStringArguments); 
... 
x = args.arg1; 
y = args.arg2; 
z = args.optional1; 

由於我沒有找到一個不折不扣的-the-盒子的方式來做到這一點,我在這裏發佈這個解決方案,並希望它也可能對其他人有用。 如果有更好的方法來實現這一點,請讓我知道。

相關問題