Matlab: Menjalankan file m dari baris perintah

107

Seandainya;

Saya memiliki m-file di lokasi:
C:\M1\M2\M3\mfile.m

Dan file exe dari matlab ada di lokasi ini:
C:\E1\E2\E3\matlab.exe

Saya ingin menjalankan m-file ini dengan Matlab, dari baris perintah, misalnya di dalam file .bat. Bagaimana saya bisa melakukan ini, apakah ada cara untuk melakukannya?

hkBattousai
sumber

Jawaban:

107

Perintah seperti ini berhasil menjalankan m-file:

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

hkBattousai
sumber
Pertanyaan serupa lainnya ada di sini untuk menjawab: stackoverflow.com/questions/25102699/…
Eghbal
6
Itu akan bagus jika Anda menambahkan perintah "keluar" di akhir untuk membuat jawaban Anda lebih praktis dan bermanfaat.
Kamran Bigdely
3
Tanda kutip tunggal dan ganda di dalam dan di sekitar perintah "run" adalah penting!
Kamran Bigdely
5
Bagaimana jika Anda ingin menyampaikan argumen?
Apakah versi Windows mendukung opsi -nodesktop? Saya pikir tidak, tapi mungkin salah.
Terje Sandstrøm
70

Menurut saya satu poin penting yang tidak disebutkan dalam jawaban sebelumnya adalah, jika tidak disebutkan secara eksplisit, penerjemah matlab akan tetap terbuka. Oleh karena itu, untuk jawaban @hkBattousai saya akan menambahkan exitperintah:

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

elachell
sumber
7
Untuk beberapa alasan jika mfile.mmemicu kesalahan, exitfungsi eksplisit tidak pernah dipanggil, membuat seluruh proses menunggu ...
malat
41

Inilah yang akan saya gunakan sebagai gantinya, untuk menangani kesalahan dari skrip dengan anggun:

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

Jika Anda ingin lebih banyak verbositas:

"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"

Saya menemukan referensi aslinya di sini . Karena tautan asli sekarang hilang, berikut ini tautan ke pembaca baru alternatif yang masih hidup sampai sekarang:

malat
sumber
27

Di Linux Anda dapat melakukan hal yang sama dan Anda benar-benar dapat mengirim kembali ke shell kode kesalahan khusus, seperti berikut:

#!/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: $?"

itu mencetak matlab exit code: 1jika skrip melempar pengecualian, matlab exit code: 0jika tidak.

slux83
sumber
3
Untuk menampilkan kesalahan seperti yang akan dilakukan MATLAB saat tidak menangkapnya, lakukan saja "try, run('/foo/bar/my_script.m'), catch e, disp(getReport(e)), exit(1), end, exit(0);"
danieleds
13

Berikut langkah-langkahnya:

  1. Mulai baris perintah.
  2. Masukkan folder yang berisi file .m dengan cd C:\M1\M2\M3
  3. Jalankan perintah berikut: C:\E1\E2\E3\matlab.exe -r mfile

Sistem Windows akan menggunakan folder Anda saat ini sebagai lokasi MATLAB untuk mencari file .m, dan -ropsi mencoba untuk memulai file .m yang diberikan segera setelah startup terjadi.

aardvarkk.dll
sumber
1
Itu tidak akan berjalan di dalam file .bat. Saya memberikannya sebagai contoh. Sebenarnya, saya akan menjalankannya dengan fungsi Win32 API CreateProcessW().
hkBattousai
12
cat 1.m | matlab -nodesktop -nosplash

Dan saya menggunakan Ubuntu

Jia Ruipeng
sumber
8

Terima kasih malat. Komentar Anda membantu saya. Tetapi saya ingin menambahkan blok try-catch saya, karena saya menemukan MExeptionmetode getReport()yang mengembalikan seluruh pesan kesalahan dan mencetaknya ke konsol matlab.

Selain itu saya mencetak nama file karena kompilasi ini adalah bagian dari skrip batch yang memanggil matlab.

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

Untuk nama model palsu yang diteruskan ke metode pembuatan kode lama, hasilnya akan terlihat seperti:

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 ';']);

Terakhir, untuk menampilkan output di jendela prompt perintah windows, cukup log konsol matlab ke file dengan -logfile logfile.txt(gunakan tambahan -wait) dan panggil perintah batchtype logfile.txt

CanO
sumber
5

Sejak R2019b, ada opsi baris perintah baru -batch,. Ini menggantikan -r, yang tidak lagi direkomendasikan. Ini juga menyatukan sintaks di seluruh platform. Lihat misalnya dokumentasi untuk Windows , untuk platform lain deskripsinya identik.

matlab -batch "statement to run"

Ini memulai MATLAB tanpa desktop atau layar splash, mencatat semua output ke stdoutdan stderr, keluar secara otomatis ketika pernyataan selesai, dan memberikan kode keluar yang melaporkan keberhasilan atau kesalahan.

Dengan demikian, tidak perlu lagi menggunakan try/ catchmengelilingi kode untuk dijalankan, dan tidak perlu lagi menambahkan exitpernyataan.

Cris Luengo
sumber
2

Saya menjalankan perintah ini dalam skrip bash, khususnya untuk mengirimkan pekerjaan SGE dan proses batch:

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

Karena tidak ada jawaban yang memiliki informasi tentang argumen input makan, penting untuk menambahkannya di sini. Setelah beberapa penelitian, saya menemukan tautan ini

Memberi makan argumen sangat mirip dengan cara kami menjalankan fungsi Matlab.

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

Jika Anda entah bagaimana mendapatkan argumen dari bash / terminal, Anda hanya perlu memasukkannya ke dalam perintah bash sebagai:

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

(Ini setelah beberapa kali coba-coba)

smttsp
sumber