2010-01-04 143 views
30

基本上我有一個m文件,它看起來像如何從Linux命令行調用MATLAB函數?

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

我只想沒有進入MATLAB在命令行中執行它。我試了幾個選項(-nodisplay-nodesktop-nojvm-r等),沒有一次成功。我最終進入MATLAB,必須輸入「quit」才能退出。

解決方案是什麼?

+1

從MathWorks公司:我如何在UNIX機器上在批處理模式下運行MATLAB? ](http://www.mathworks.com/support/solutions/en/data/1-15HNG/index.html) – 2010-01-04 18:24:21

回答

25

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

這是什麼輸入? – ablimit 2010-01-04 21:13:27

+0

我做的只是: matlab -nojvm -nodisplay -nosplash /dev/null 2>/dev/null 無論如何,它打印一些錯誤消息,但結果是正確的。 – ablimit 2010-01-04 21:37:22

+0

是的!有效。 謝謝亞歷克斯! – ablimit 2010-01-04 21:49:54

20

用途:

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

確保matlabCommand有一個出口作爲其最後線。

1
nohup matlab -nodisplay -nodesktop -nojvm -nosplash -r script.m > output & 
+1

爲什麼'-nojvm'?我可能需要'java'功能。 – gerrit 2013-02-06 09:30:11

12

你可以調用的函數是這樣的:

MATLAB -r 「yourFunction中(0)」

+0

可以在這些大括號中給出輸入嗎? – 2013-01-25 15:59:55

+2

如果你不希望MATLAB在運行該函數後繼續執行,那麼使用''matlab -r'func(arg1,arg2,..);退出「'''。 – nimrodm 2013-06-27 08:42:14

0

你可以編譯成myfile一個獨立的程序和運行來代替。使用Matlab的編譯器mcc爲(如果有的話),更多信息在該question提供。

這個答案是從我的答案複製到another question

3

你可以通過一個命令MATLAB,這樣運行在命令行的任意函數:

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

這將執行MATLAB命令funcname('arg1', 'arg2', 'arg3', 'argN')。因此,所有的參數都會以字符串形式傳遞,而你的函數需要處理這個,但是這又一次適用於任何其他語言的命令行選項。

0

我已經修改了亞歷克斯·科恩的回答爲我自己的需要,所以在這兒呢。

我的要求是批處理腳本可以處理字符串和整數/雙輸入,並且Matlab應該從調度器腳本被調用的目錄運行。

#!/bin/bash 

matlab_exec=matlab 

#Remove the first two arguments 
i=0 
for var in "[email protected]" 
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

其中,最後兩個參數將作爲數字和前兩個作爲字符串傳遞。

7

這裏有一個簡單的解決方案,我發現。

我有一個函數FUNC(VAR),我想從一個shell腳本運行,並傳遞給它的第一個參數的變種。我把它放在我的shell腳本中:

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

這對我來說就像一種享受。訣竅是你必須對MATLAB使用雙引號和「-r」命令,並使用單引號將bash參數傳遞給MATLAB。

只要確保你的MATLAB腳本的最後一行是「退出」,或者你運行

matlab -nodesktop -nosplash -r "func('$1'); exit" 
+0

請注意,至少在我的設置中,在$ 1周圍使用單引號將環境變量作爲字符串傳遞,並且使用$ 1左右的任何引號將其作爲數字傳入。另外,在我的設置中,如果func是一個函數.m文件,則不需要將退出放在雙引號中。 – Grittathh 2013-05-23 22:01:53