В основном у меня есть файл m
, который выглядит как
function Z=myfunc()
% Do some calculations
dlmwrite('result.out',Z,',');
end
Я просто хочу выполнить его из командной строки, не входя в MATLAB. Я попробовал несколько опций (-nodisplay
, -nodesktop
, -nojvm
, -r
и т.д.), Ни одна из них не работала. Я вхожу в MATLAB и должен набирать "quit" для выхода.
Какое решение?
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 -nosplash -nodesktop -logfile remoteAutocode.log -r matlabCommand
Убедитесь, что matlabCommand
имеет выход в качестве последней строки.
Вы можете вызывать такие функции:
matlab -r "yourFunction (0)"
matlab -r "func(arg1,arg2,..);exit"
если вы не хотите, чтобы MATLAB оставался после запуска функции.
Вот простое решение, которое я нашел.
У меня есть функция func (var), которую я хотел запустить из оболочки script и передать ей первый аргумент для var. Я положил это в свою оболочку script:
matlab -nodesktop -nosplash -r "func('$1')"
Это помогло мне. Фокус в том, что вам нужно использовать двойные кавычки с командой -r для MATLAB и использовать одинарные кавычки, чтобы передать аргумент bash в MATLAB.
Просто убедитесь, что последняя строка вашего MATLAB script - это "exit" или вы запускаете
matlab -nodesktop -nosplash -r "func('$1'); exit"
Вы можете запустить произвольную функцию из командной строки, передав команду Matlab, например:
matlab -nodisplay -r "funcname arg1 arg2 arg3 argN"
Это выполнит команду Matlab funcname('arg1', 'arg2', 'arg3', 'argN')
. Ergo, все аргументы будут переданы как строки, и ваша функция должна справиться с этим, но опять же это относится к параметрам командной строки на любом другом языке.
nohup matlab -nodisplay -nodesktop -nojvm -nosplash -r script.m > output &
-nojvm
? Мне могут понадобиться функции java
.
Я изменил ответ Алекса Коэна для своих собственных нужд, так что вот оно.
Мои требования заключались в том, что дозатор script мог обрабатывать строковые и целочисленные/двойные входы и что Matlab должен запускаться из каталога, из которого вызывается дозатор script.
#!/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
Этот script можно вызвать как (если он на вашем пути): matlab_batcher.sh functionName stringArg1 stringArg2 1 2.0
Где, последние два аргумента будут переданы как числа, а первые два - как строки.
Вы можете скомпилировать myfile
в автономную программу и запустить ее. Для этого используйте компилятор Matlab mcc
(если он у вас есть), в этой question содержится дополнительная информация.
Этот ответ был скопирован из моего ответа на еще один вопрос.