Как вызвать функции MATLAB из командной строки Linux?

30

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

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

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

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

Теги:
command-line

8 ответов

26
Лучший ответ

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
  • 0
    Какой вклад здесь ???
  • 0
    То, что я сделал, это просто: matlab -nojvm -nodisplay -nosplash <my_mfile.m> / dev / null 2> / dev / null В любом случае он выводит сообщение об ошибке, но результат верный.
Показать ещё 7 комментариев
20

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

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

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

12

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

matlab -r "yourFunction (0)"

  • 0
    можно ли вводить данные в эти скобки?
  • 2
    Сделайте этот matlab -r "func(arg1,arg2,..);exit" если вы не хотите, чтобы MATLAB оставался после запуска функции.
7

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

У меня есть функция 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"
  • 0
    Обратите внимание, что, по крайней мере, в моей установке, использование одинарных кавычек около $ 1 передает переменную окружения в виде строки, а использование без кавычек около $ 1 передает ее как число. Кроме того, в моей настройке, если func - это файл функции .m, вам не нужно ставить exit в двойных кавычках.
3

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

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

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

1
nohup matlab -nodisplay -nodesktop -nojvm -nosplash -r script.m > output &
  • 1
    Почему -nojvm ? Мне могут понадобиться функции java .
0

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

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

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

0

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню