如何在 Linux/Unix 上运行的独立 MATLAB 可执行文件中传递命令行参数?

28

我如何在Linux/UNIX上运行的独立MATLAB可执行文件中传递命令行参数?

我需要将我的MATLAB脚本编译为独立文件,可以在没有安装MATLAB的机器上运行。它需要能够以类似于C的argv[]的方式工作,您需要执行以下操作:

命令行:

myfile argument1.txt argument2.txt

第一个和第二个参数分别是输入和输出文件。确切的语法并不重要,但它应该像argv[]一样工作。有没有一个函数可以做到这一点?


我的意思是我在计算机上安装了MATLAB,但我需要制作一个独立的可执行文件,可以在没有MATLAB的Unix系统上运行(它是一个仅有一个节点拥有MATLAB的集群)。我需要找到一种方法,在不安装MATLAB的情况下使varargin函数生效。如果我能告诉MATLAB将MATLAB库放入每个可执行文件中,那就可以,只要它是一个完整的独立包。

3个回答

26

在 MATLAB 的官方网站上有一个详细的样例,其中介绍了如何编译简单应用程序并在另一台电脑上部署它。简而言之,您需要将 MATLAB Compiler Runtime 与您的应用程序一起安装;运行时安装程序应该已经包含在您的 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;

1
返回值怎么样? - guilhermecgs
1
我试图跟随链接,结果进入了一个通用的MathWorks页面。为了找到一个新的、更新的URL,以便我可以编辑答案,我被要求提供MathWorks登录才能访问文档。我认为MathWorks下意识地请求人们放弃他们,转而使用Octave、R和NumPy。 - mightypile
@mightypile 我已经用新链接替换了损坏的链接;但我不知道 (1) 这是否是我在2001年链接的相同内容,以及 (2) 是否需要MathWorks账户才能查看该页面(我同意你的最后一句话...) - Riccardo Murri
我已将此链接更改为不包含版本号的链接。该链接不需要许可证即可查看(您只需要许可证来阅读以前版本的MATLAB文档,因此,如果现在可以在没有许可证的情况下查看带有版本号的链接,则在发布新版本时将不再可见)。 - Cris Luengo

3

我曾经遇到同样的问题,搜索了一种通用解决方案,解决脚本中参数作为字符串传递但需要作为标量或向量的问题。假设你有以下函数:

function myfunc(arg1, arg2, varargs)
end

你可能希望能够像这样调用它

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

and also like

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

然后我可以在myfunc中使用inputParser,像这样:

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;

由于我找不到现成的方法来做到这一点,所以我在这里发布了这个解决方案,并希望它也对其他人有用。 如果有更好的方法实现这个功能,请告诉我。


1

如果没有安装MATLAB,就无法在计算机上运行MATLAB。但您可以安装免费的MATLAB组件运行时(MCR)并运行MATLAB程序。要构建“独立”可执行文件,还需要MATLAB编译器。

一旦具备这些条件,MATLAB将拥有处理命令行参数所需的所有功能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接