Matlab: executando um arquivo m na linha de comando

106

Suponha que;

Tenho um arquivo m no local:
C:\M1\M2\M3\mfile.m

E o arquivo exe do matlab está neste local:
C:\E1\E2\E3\matlab.exe

Quero executar este arquivo m com Matlab, da linha de comando, por exemplo, dentro de um arquivo .bat. Como posso fazer isso, existe uma maneira de fazer isso?

hkBattousai
fonte

Respostas:

106

Um comando como este executa o arquivo m com sucesso:

"C:\<a long path here>\matlab.exe" -nodisplay -nosplash -nodesktop -r "run('C:\<a long path here>\mfile.m'); exit;"

hkBattousai
fonte
Outra pergunta semelhante está aqui para responder: stackoverflow.com/questions/25102699/…
Eghbal
6
Isso seria bom se você adicionar o comando "exit" no final para tornar sua resposta mais prática e útil.
Kamran Bigdely
3
As aspas simples e duplas dentro e ao redor do comando "executar" são importantes!
Kamran Bigdely
5
E se você quiser passar argumentos?
A versão do Windows oferece suporte à opção -nodesktop? Eu pensei que não, mas pode estar errado.
Terje Sandstrøm
70

Acho que um ponto importante que não foi mencionado nas respostas anteriores é que, se não for explicitamente indicado, o interpretador de matlab permanecerá aberto. Portanto, à resposta de @hkBattousai adicionarei o exitcomando:

"C:\<a long path here>\matlab.exe" -nodisplay -nosplash -nodesktop -r "run('C:\<a long path here>\mfile.m');exit;"

Elachell
fonte
7
Por alguma razão, se mfile.mdisparar um erro, a exitfunção explícita nunca é chamada, fazendo todo o processo esperar ...
mamalat
41

Aqui está o que eu usaria em vez disso, para lidar com erros do script normalmente:

"C:\<a long path here>\matlab.exe" -nodisplay -nosplash -nodesktop -r "try, run('C:\<a long path here>\mfile.m'), catch, exit, end, exit"

Se você quiser mais verbosidade:

"C:\<a long path here>\matlab.exe" -nodisplay -nosplash -nodesktop -r "try, run('C:\<a long path here>\mfile.m'), catch me, fprintf('%s / %s\n',me.identifier,me.message), end, exit"

Encontrei a referência original aqui . Já que o link original acabou, aqui está o link para um novo leitor alternativo que ainda está vivo hoje:

malat
fonte
26

No Linux, você pode fazer o mesmo e pode enviar de volta ao shell um código de erro personalizado, como o seguinte:

#!/bin/bash
matlab -nodisplay -nojvm -nosplash -nodesktop -r \ 
      "try, run('/foo/bar/my_script.m'), catch, exit(1), end, exit(0);"
echo "matlab exit code: $?"

ele imprime matlab exit code: 1se o script lançar uma exceção, matlab exit code: 0caso contrário.

slux83
fonte
3
Para exibir o erro como o MATLAB faria quando não fosse detectado, basta fazer "try, run('/foo/bar/my_script.m'), catch e, disp(getReport(e)), exit(1), end, exit(0);"
danieleds
13

Aqui estão as etapas:

  1. Inicie a linha de comando.
  2. Entre na pasta que contém o arquivo .m com cd C:\M1\M2\M3
  3. Execute o seguinte: C:\E1\E2\E3\matlab.exe -r mfile

Os sistemas Windows usarão sua pasta atual como local para o MATLAB procurar arquivos .m, e a -ropção tenta iniciar o arquivo .m fornecido assim que a inicialização ocorrer.

Aardvarkk
fonte
1
Ele não será executado dentro de um arquivo .bat. Eu dei isso como um exemplo. Na verdade, irei executá-lo pela função API do Win32 CreateProcessW().
hkBattousai
12
cat 1.m | matlab -nodesktop -nosplash

E eu uso Ubuntu

Jia Ruipeng
fonte
8

Graças a malat. Seu comentário me ajudou. Mas eu quero adicionar meu bloco try-catch, pois encontrei o MExeptionmétodo getReport()que retorna a mensagem de erro inteira e a imprime no console do matlab.

Além disso, imprimi o nome do arquivo, pois essa compilação faz parte de um script em lote que chama matlab.

try
    some_code
    ...
catch message
    display(['ERROR in file: ' message.stack.file])
    display(['ERROR: ' getReport(message)])
end;

Para um nome de modelo falso passado ao método de geração de código legado, a saída seria:

ERROR in file: C:\..\..\..
ERROR: Undefined function or variable 'modelname'.

Error in sub-m-file (line 63)
legacy_code( 'slblock_generate', specs, modelname);

Error in m-file (line 11)
sub-m-file

Error in run (line 63)
evalin('caller', [script ';']);

Finalmente, para exibir a saída na janela do prompt de comando do Windows, basta registrar o console do matlab em um arquivo com -logfile logfile.txt(use adicionalmente -wait) e chamar o comando batchtype logfile.txt

CanO
fonte
4

Desde R2019b, existe uma nova opção de linha de comando -batch,. Ele substitui -r, o que não é mais recomendado. Ele também unifica a sintaxe entre plataformas. Veja por exemplo a documentação para Windows , para as outras plataformas a descrição é idêntica.

matlab -batch "statement to run"

Isso inicia o MATLAB sem a área de trabalho ou tela inicial, registra todas as saídas para stdoute stderr, sai automaticamente quando a instrução é concluída e fornece um código de saída relatando sucesso ou erro.

Portanto, não é mais necessário usar try / em catchtorno do código para ser executado e não é mais necessário adicionar uma exitinstrução.

Cris Luengo
fonte
2

Eu executo este comando em um script bash, em particular para enviar tarefas SGE e coisas de processamento em lote:

/Path_to_matlab -nodisplay -nosplash -nodesktop < m_file.m
LMLacerda
fonte
0

Como nenhuma das respostas contém informações sobre como alimentar o argumento de entrada, é importante adicioná-lo aqui. Depois de alguma pesquisa, encontrei este link

Alimentar os argumentos é muito semelhante a como executamos uma função Matlab.

matlab -r 'try myfunction(argument1,argument2); catch; end; quit'

Se você está de alguma forma recebendo um argumento do bash / terminal, você simplesmente precisa inseri-lo no comando bash como:

matlab -r 'try myfunction($MY_BASH_ARG,argument2); catch; end; quit'

(Isso depois de algumas tentativas e erros)

smttsp
fonte