【问题标题】:How to call MATLAB functions from the Linux command line?如何从 Linux 命令行调用 MATLAB 函数?
【发布时间】:2010-01-04 18:17:13
【问题描述】:

基本上我有一个m 文件,看起来像

function Z=myfunc()
    % Do some calculations
    dlmwrite('result.out',Z,',');
end

我只想从命令行执行它而不进入 MATLAB。我尝试了几个选项(-nodisplay-nodesktop-nojvm-r 等),但都没有奏效。我最终进入 MATLAB,必须输入“quit”才能退出。

解决办法是什么?

【问题讨论】:

标签: linux command-line matlab


【解决方案1】:

MATLAB 可以运行脚本,但不能从命令行运行函数。我就是这样做的:

文件matlab_batcher.sh

#!/bin/sh

matlab_exec=matlab
X="${1}(${2})"
echo ${X} > matlab_command_${2}.m
cat matlab_command_${2}.m
${matlab_exec} -nojvm -nodisplay -nosplash < matlab_command_${2}.m
rm matlab_command_${2}.m

通过输入调用它:

./matlab_batcher.sh myfunction myinput

【讨论】:

  • 我所做的只是: matlab -nojvm -nodisplay -nosplash /dev/null 2>/dev/null 无论如何它会打印一些错误消息,但结果是正确的。跨度>
  • 对不起,命令行输入:$1是函数名,$2是函数的输入
  • 这实际上是不正确的。 Matlab 可以从命令行运行函数。试试matlab -nodisplay "funcname arg1 arg2 arg3 argN"。唯一的限制是所有参数都是字符串。
  • @gerrit。如果添加括号,参数也可以是数字:matlab -r "myfunc(1,2);exit"
  • @nimrodm 是的。我通常想将它连接到(bash)shell脚本,然后matlab -nodisplay "funcname $@"将功能限制为前者。
【解决方案2】:

用途:

matlab -nosplash -nodesktop -logfile remoteAutocode.log -r matlabCommand

确保matlabCommand 的最后一行有一个出口。

【讨论】:

    【解决方案3】:

    你可以这样调用函数:

    matlab -r "yourFunction(0)"

    【讨论】:

    • 可以在这些大括号中给出输入吗?
    • 如果您不希望 MATLAB 在运行该函数后继续存在,请使用 matlab -r "func(arg1,arg2,..);exit"
    【解决方案4】:

    这是我找到的一个简单解决方案。

    我有一个函数 func(var),我想从一个 shell 脚本运行它并将它传递给 var 的第一个参数。我把它放在我的 shell 脚本中:

    matlab -nodesktop -nosplash -r "func('$1')"
    

    这对我来说就像是一种享受。诀窍是您必须在 MATLAB 的“-r”命令中使用双引号,并使用单引号将 bash 参数传递给 MATLAB。

    只要确保你的 MATLAB 脚本的最后一行是“exit”或者你运行

    matlab -nodesktop -nosplash -r "func('$1'); exit"
    

    【讨论】:

    • 请注意,至少在我的设置中,在 $1 周围使用单引号将环境变量作为字符串传递,而在 $1 周围不使用引号将其作为数字传递。另外,在我的设置中,如果 func 是一个函数 .m 文件,则不需要将 exit 放在双引号中。
    【解决方案5】:

    您可以通过将命令传递给 Matlab 从命令行运行任意函数,如下所示:

    matlab -nodisplay -r "funcname arg1 arg2 arg3 argN"
    

    这将执行 Matlab 命令funcname('arg1', 'arg2', 'arg3', 'argN')。因此,所有参数都将作为字符串传递,您的函数需要处理此问题,但话又说回来,这也适用于任何其他语言的命令行选项。

    【讨论】:

      【解决方案6】:
      nohup matlab -nodisplay -nodesktop -nojvm -nosplash -r script.m > output &
      

      【讨论】:

      • 为什么是-nojvm?我可能需要java 函数。
      【解决方案7】:

      您可以将myfile 编译成一个独立的程序并运行它。为此,请使用 Matlab 的编译器 mcc(如果有的话),此 question 中提供了更多信息。

      这个答案是从我对another question的答案复制而来的。

      【讨论】:

        【解决方案8】:

        我已经根据自己的需要修改了 Alex Cohen 的答案,所以在这里。

        我的要求是批处理脚本可以处理字符串和整数/双精度输入,并且 Matlab 应该从调用批处理脚本的目录中运行。

        #!/bin/bash
        
        matlab_exec=matlab
        
        #Remove the first two arguments
        i=0
        for var in "$@"
        do
         args[$i]=$var
         let i=$i+1
        done
        unset args[0]
        
        #Construct the Matlab function call
        X="${1}("
        for arg in ${args[*]} ; do
          #If the variable is not a number, enclose in quotes
          if ! [[ "$arg" =~ ^[0-9]+([.][0-9]+)?$ ]] ; then
            X="${X}'"$arg"',"
          else
            X="${X}"$arg","
          fi
        done
        X="${X%?}"
        X="${X})"
        
        echo The MATLAB function call is ${X}
        
        #Call Matlab
        echo "cd('`pwd`');${X}" > matlab_command.m
        ${matlab_exec} -nojvm -nodisplay -nosplash < matlab_command.m
        
        #Remove the matlab function call
        rm matlab_command.m
        

        这个脚本可以这样调用(如果它在你的路径上): matlab_batcher.sh functionName stringArg1 stringArg2 1 2.0

        其中,最后两个参数将作为数字传递,前两个参数作为字符串传递。

        【讨论】:

          猜你喜欢
          • 2013-01-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-05-06
          • 1970-01-01
          • 1970-01-01
          • 2010-11-27
          相关资源
          最近更新 更多