2012-04-10 94 views
10

如果我有這樣的matlab函數如何從bash腳本中獲取matlab的返回值?

function [result] = matlab_test(param1, param2) 

disp(sprintf('param1 : %s', param1)); 
disp(sprintf('param2 : %s', param2)); 

result = 'hello matlab'; 

而且我想調用此matlab函數在bash腳本像

matlab -nodesktop -nosplash -nodisplay -r "try, A=matlab_test('test','matlab'); end; quit" 
echo $A 

而且我想這個輸出

test 
matlab 
hello matlab 

我的要求,這裏是以查找是否可以在我的bash腳本中使用來自Matlab的返回值,並將其傳遞給管道。我只想讓我的應用程序分成小組件(文件)並通過管道/參數進行通信。總之,我想看看我可以將Matlab腳本封裝在我的bash腳本中多遠,以便可以設置我的代碼體系結構。
如果我不能這樣做,我會簡單地將需要返回值的部分捆綁到matlab腳本中。

+0

我編輯了我的答案,試圖回答你修改後的問題。 – Sevenless 2012-04-11 17:41:16

+0

如果返回值是一個小整數,一個簡單的解決方法是使用['exit(code)'](http://au.mathworks.com/help/matlab/)將它作爲Matlab進程的退出代碼返回。 ref/exit.html)命令。在Windows上嘗試此操作時,請不要忘記['-wait'](http://au.mathworks.com/help/matlab/ref/matlabwindows.html)''matlab'的命令行參數。 – 2016-05-22 09:10:09

回答

6

你在問兩個問題。我會回答這兩個問題,包括爲什麼第二個可能不可能取決於您的操作系統(並且絕對不可能在我的系統上),然後針對問題相關的解決方法提供建議。

首先,我在使用Matlab與shell交互時使用這樣的腳本。

#!/bin/sh 

cat <<EOF | matlab -nodesktop -nosplash -nodisplay 
A=matlab_test('$1','$2'); 
system(['export temp1=' A]); %doesn't work 
setenv('temp2',A); %also doesn't work, I'll explain why below 
exit 
EOF 
echo $temp1 
echo $temp2 

給輸出:

[[email protected] ~]$ ./stack_ex test matlab 
Warning: No window system found. Java option 'MWT' ignored 

          < M A T L A B (R) > 
        Copyright 1984-2010 The MathWorks, Inc. 
       Version 7.12.0.635 (R2011a) 64-bit (glnxa64) 
           March 18, 2011 


    To get started, type one of these: helpwin, helpdesk, or demo. 
    For product information, visit www.mathworks.com. 

>> param1 : test 
param2 : matlab 
>> >> >> 

所以明確設置環境變量的兩個版本無法正常工作。這導致我們回到第二個問題。

「回聲」失敗的原因是systemsetenv都創建了當Matlab關閉時關閉的shell。也就是說,Matlab不能在調用它的shell之外設置環境變量。

對於使用微軟工具討論的in this posting的Windows系統,有一種解決方法。還提到了here

我不相信有一種解決方法可以讓* nix系統在Matlab中設置環境變量。

下面是一個方法來做類似於你所描述的。

我假設使用回聲不是你真正想要做的。相反,我猜你希望使用存儲在環境變量中的字符串輸出,以用於進一步處理shell中的命令或腳本。一個可能的解決方法是以下幾點:

#!/bin/sh 

cat <<EOF | matlab -nodesktop -nosplash -nodisplay 
A=matlab_test('$1','$2'); 
setenv('temp1',A); %doesn't work 
[a b] = system(['echo ' '$' 'temp1']) 
exit 
EOF 

給予輸出: [XXXXXX @計算-0-138〜] $ ./stack_ex_3測試MATLAB 警告:未找到窗口系統。 java選項「MWT」忽略

      < M A T L A B (R) > 
        Copyright 1984-2010 The MathWorks, Inc. 
       Version 7.12.0.635 (R2011a) 64-bit (glnxa64) 
           March 18, 2011 


    To get started, type one of these: helpwin, helpdesk, or demo. 
    For product information, visit www.mathworks.com. 

>> param1 : test 
param2 : matlab 
>> >> 
a = 

    0 


b = 

hello matlab 

這表明命令echo $temp1setenv和temp1中創建子shell評價認爲分配給它的價值。這個對shell的調用結果現在存儲在b中(保持0表示成功)。可以想象,您可以通過系統命令在shell中傳遞所有您想要執行的操作,以便它在子shell中運行。我們必須瞭解您的問題的更多細節,才能對此方法進行全面評估。

編輯和隨訪**********************

的最接近包裝Matlab和慶典,我能想到的是下面的技巧。可以通過管道從MATLAB腳本輸出到myresult.out下列要求:

#!/bin/sh 

cat <<EOF | matlab -nodesktop -nosplash -nodisplay /> myresult.out 
A=matlab_test('$1','$2'); 
disp(['grepMe ' A]) 
exit 
EOF 

您可以從myresult.out用grep的grepMe線,管的sed,並選擇您需要的輸出線的只有一部分,然後通過管道將在你腳本的其餘部分。這與我認爲你可以達到你想要做的一樣接近。

+0

有關我的要求的更多解釋,請參閱我的問題中的更新。你的回答很好,但我需要更優雅的方式將該值發送給bash腳本。 – 2012-04-11 07:38:32

2

你在這裏試圖做兩件事。首先:在一個shell中顯示一個Matlab程序的輸出。其次,在shell中分配一個變量。

當我嘗試這樣做,我發現,Matlab的會寫遍,其開口消息標準輸出,所以我落得這樣做:

mkfifo ~/matlab_output 
matlab ... > /dev/null & cat ~/matlab_output 

,然後裏面MATLAB,以取代sprintf

f = fopen('~/matlab_output', 'w'); 
fprintf(f, 'param1 : %s', param1); 
fclose(f); 

這是您的第一個需求的解決方案(您可以只寫一個普通文件,然後捕獲文件,但是您必須使用&&,所以在Matlab完全完成之前您不會看到輸出)。第二個問題 - 在MATLAB中執行「A = result」並且能夠在shell中「echo $ A」 - 比較困難。你可以這樣做:

mkfifo ~/matlab_commands 
mkfifo ~/matlab_output 
matlab ... > /dev/null & cat ~/matlab_output & eval $(cat ~/matlab_commands) 

,並在MATLAB:

f2 = fopen('~/matlab_commands', 'w'); 
fprintf(f2, 'A=%s', double2str(results)); 
fclose(f2); 

,但我真的不知道如何這會工作。

2

過去幾天一直在想這件事,只是想到了一些事情。你可以使用一個MATLAB克隆作爲#!腳本解釋器。我的選擇是Octave,如下所示:

#! /usr/bin/octave -qf 
A=matlab_test('test','matlab'); 
printf(A) 

printf將A的值放入標準輸出中,您可以從那裏輸入。

[email protected][~]$ ./oshelltest 
param1 : test 
param2 : matlab 
hello matlab 
[email protected][~]$ ./oshelltest | grep hello 
hello matlab 

現在Octave是不準確一樣MATLAB,但已經很接近了,也許足以滿足您的需求。它也有免費的優勢。

相關問題