Как вызвать функции MATLAB из командной строки Linux? - PullRequest
30 голосов
/ 04 января 2010

В основном у меня есть файл m, который выглядит как

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

Я просто хочу выполнить его из командной строки, не входя в MATLAB. Я пробовал несколько вариантов (-nodisplay, -nodesktop, -nojvm, -r и т. Д.), Ни один из них не работал. Я заканчиваю тем, что попадаю в MATLAB, и для выхода набираю «quit».

Какое решение?

Ответы [ 8 ]

25 голосов
/ 04 января 2010

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
20 голосов
/ 13 мая 2010

Использование:

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

Убедитесь, что matlabCommand имеет выход в качестве последней строки.

12 голосов
/ 07 декабря 2011

Вы можете вызывать такие функции:

matlab -r "yourFunction (0)"

7 голосов
/ 11 апреля 2013

Вот простое решение, которое я нашел.

У меня есть функция func (var) , которую я хотел запустить из сценария оболочки и передать ей первый аргумент для var. Я поместил это в мой скрипт:

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

Это работало как удовольствие для меня. Хитрость заключается в том, что вы должны использовать двойные кавычки с командой "-r" для MATLAB и использовать одинарные кавычки, чтобы передать аргумент bash в MATLAB.

Просто убедитесь, что последняя строка вашего скрипта MATLAB - "exit" или что вы запускаете

matlab -nodesktop -nosplash -r "func('$1'); exit"
3 голосов
/ 06 февраля 2013

Вы можете запустить произвольную функцию из командной строки, передав команду Matlab, например:

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

Это выполнит команду Matlab funcname('arg1', 'arg2', 'arg3', 'argN'). Поэтому все аргументы будут переданы в виде строк, и ваша функция должна это обработать, но, опять же, это относится и к параметрам командной строки на любом другом языке.

1 голос
/ 09 июля 2010
nohup matlab -nodisplay -nodesktop -nojvm -nosplash -r script.m > output &
0 голосов
/ 20 февраля 2013

Я изменил ответ Алекса Коэна для своих нужд, поэтому вот он.

Мои требования заключались в том, чтобы скрипт-дозатор мог обрабатывать строковые и целочисленные / двойные вводы, и чтобы 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

Где, два последних аргумента будут переданы как числа, а первые два - как строки.

0 голосов
/ 05 февраля 2013

Вы можете скомпилировать myfile в отдельную программу и запустить ее вместо этого. Для этого используйте компилятор Matlab mcc (если он у вас есть), в этом вопросе .

содержится дополнительная информация.

Этот ответ был скопирован из моего ответа на другой вопрос .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...