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-盒子的方式来做到这一点,我在这里发布这个解决方案,并希望它也可能对其他人有用。 如果有更好的方法来实现这一点,请让我知道。

相关问题