如何从Linux命令行调用MATLAB函数?

如何从Linux命令行调用MATLAB函数?,linux,command-line,matlab,Linux,Command Line,Matlab,基本上我有一个m文件 function Z=myfunc() % Do some calculations dlmwrite('result.out',Z,','); end 我只想从命令行执行它,而不用进入MATLAB。我尝试了几个选项(-nodisplay,-nodesktop,-nojvm,-r,等等),但都不起作用。我最终进入了MATLAB,必须输入“退出”才能退出 解决方案是什么?可以运行脚本,但不能从命令行运行函数。我就是这么做的: 文件matlab\u batch

基本上我有一个
m
文件

function Z=myfunc()
    % Do some calculations
    dlmwrite('result.out',Z,',');
end
我只想从命令行执行它,而不用进入MATLAB。我尝试了几个选项(
-nodisplay
-nodesktop
-nojvm
-r
,等等),但都不起作用。我最终进入了MATLAB,必须输入“退出”才能退出

解决方案是什么?

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

文件
matlab\u 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
使用:


确保
matlabCommand
的最后一行是exit。

您可以调用如下函数:

nohup matlab -nodisplay -nodesktop -nojvm -nosplash -r script.m > output &
matlab -nodisplay -r "funcname arg1 arg2 arg3 argN"

matlab-r“yourFunction(0)”

您可以将
myfile
编译成一个独立的程序,然后运行它。使用Matlab的编译器
mcc
(如果您有),本文将提供更多信息


此答案是从我的答案复制到的。

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

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

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

我已经根据自己的需要修改了Alex Cohen的答案,就是这样

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

#!/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
#/bin/bash
matlab_exec=matlab
#删除前两个参数
i=0
对于“$@”中的变量
做
args[$i]=$var
设i=$i+1
完成
未设置参数[0]
#构造Matlab函数调用
X=“${1}(”
对于${args[*]};do中的arg
#如果变量不是数字,请用引号括起来
如果![“$arg”=~^[0-9]+([.][0-9]+)?$];那么
X=“${X}'”$arg“
其他的
X=“${X}”$arg“
fi
完成
X=“${X%?}”
X=“${X})”
echo MATLAB函数调用为${X}
#调用Matlab
echo“cd(`pwd`);${X}>matlab_command.m
${matlab_exec}-nojvm-nodisplay-nosplash
此脚本可以像这样调用(如果它位于您的路径上):
matlab\u batcher.sh函数名stringArg1 stringArg2 1 2.0


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

我找到了一个简单的解决方案

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

matlab -nodesktop -nosplash -r "func('$1')"
这对我来说是一种享受。诀窍是,为了将bash参数传递给MATLAB,必须在MATLAB的“-r”命令中使用双引号,并使用单引号

只需确保MATLAB脚本的最后一行是“退出”或运行

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

我所做的只是: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 true。我通常希望将其连接到(bash)shell脚本,然后
matlab-nodisplay“funcname$@”
将功能限制为前者。从MathWorks:[如何在UNIX机器上以批处理模式运行matlab?]()可以在这些大括号中给出输入吗?使其成为
matlab-r“func(arg1,arg2,…);退出“
如果您不想让MATLAB在运行函数后留下来。为什么
-nojvm
?我可能需要
java
函数。请注意,至少在我的设置中,使用$1左右的单引号将环境变量作为字符串传递,使用$1左右的无引号将其作为数字传递。另外,在我的设置中,如果func是一个function.m文件,则不需要将exit放在双引号中。
matlab -nodesktop -nosplash -r "func('$1'); exit"