【问题标题】:How can I pass command line arguments to a standalone MATLAB executable running on Linux/Unix?如何将命令行参数传递给在 Linux/Unix 上运行的独立 MATLAB 可执行文件?
【发布时间】:2011-03-21 02:44:43
【问题描述】:

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

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

命令行:

myfile argument1.txt argument2.txt

其中参数 1 和 2 是输入和输出文件。

确切的语法无关紧要,但它应该像argv[] 一样工作。有什么功能可以做到这一点?


我的意思是我的计算机上有 MATLAB,但我需要制作一个独立的可执行文件,该可执行文件可以在那些计算机上没有 MATLAB 的 Unix 系统上运行(它是一个集群,只有一个节点上有 MATLAB)。我需要找到一种方法来制作 varargin 函数,而无需在运行该程序的计算机上安装 MATLAB。如果我可以告诉 MATLAB 将 MATLAB 库放在每个可执行文件中,那没关系,只要它是一个完整的独立包。

【问题讨论】:

    标签: matlab command-line-arguments matlab-deployment matlab-compiler


    【解决方案1】:

    MATLAB 网站有一个 worked-through example 包含有关如何编译简单应用程序以及如何将其部署到另一台计算机上的说明。本质上,您需要安装 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

    请注意,当从命令行获取参数时,它们是 作为 strings 传递给函数,因此您需要将它们转换为 使用str2num 函数的数字。例如:

    function rc = display_product(a, b)
    
    a = str2num(a);
    b = str2num(b);
    
    display(a*b);
    
    rc = 0;
    

    【讨论】:

    • 返回值呢?
    • 我试图点击链接并最终进入了一个通用的 mathworks 页面。为了找到一个新的、更新的 url,以便我可以用它来编辑答案,我被要求登录 mathworks 来访问文档。我认为 Mathworks 是在下意识地乞求人们放弃它们,使用 octave、R 和 numpy。
    • @mightypile 我已经用新链接替换了断开的链接;但我不知道,(1)这是否与我在 2001 年链接的内容相同,以及(2)是否需要 MathWorks 帐户才能查看页面(我同意你最后的评论...)
    • 我已将此链接更改为不包含版本号的链接。此链接不需要许可证即可查看(您只需要许可证即可阅读以前版本的 MATLAB 的文档,因此带有版本号的链接如果现在无需许可证即可显示,则在发布新版本时将不再可见)。
    【解决方案2】:

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

    一旦你拥有了所有这些。 MATLAB 拥有您需要的所有功能,可以按照您的要求处理命令行参数。

    【讨论】:

      【解决方案3】:

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

      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
      

      然后我可以像这样在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;
      

      由于我没有找到开箱即用的方法,因此我在此处发布了此解决方案,并希望它对其他人也有用。 如果有更好的方法来实现这一点,请告诉我。

      【讨论】:

        猜你喜欢
        • 2010-10-23
        • 2013-10-11
        • 2010-11-26
        • 2013-11-21
        • 2011-06-21
        • 2019-08-28
        • 1970-01-01
        • 2016-11-06
        • 2016-12-19
        相关资源
        最近更新 更多