2013-10-27 41 views
3

我想打電話給MATLAB從C.開發我知道如何調用MATLAB,通過使用系統調用使用標準語法軟件:電話MATLAB和保持開放的下一個處理 - Linux的

matlab -nojvm

我的問題是,每一個我花了很多時間在打開的MATLAB一個新的會話(當被請求的處理結束,MATLAB關閉,所以我有時間的時候新的數據準備處理重新執行)。

有沒有辦法讓MATLAB會話始終打開(並將其用作「服務器」),以及如何「通知」新數據可用於處理?這將避免每次執行新一次MATLAB會執行的麻煩,這非常耗時。

+1

這就是所謂的脫氣,可以按[這裏](http://www-theorie.physik.unizh.ch/~dpotter/howto/daemonize)所述完成。 – Bort

+0

如果Matlab會話/服務器具有與父進程不同的生命週期,則只需完全守護進程(將其從shell中分離)。目前還不清楚這是否需要從原來的描述。 – wrdieter

+1

你也可以看看[這個答案](http://stackoverflow.com/questions/12306333/matlab-command-from-bash-command-line-on-an-already-running-session/12307838#12307838 )或甚至[這一個](http://stackoverflow.com/questions/18781803/call-a-function-by-an-external-application-without-opening-a-new-instance-of-mat) – thewaywewalk

回答

0

MATLAB有一個input函數,用於監聽stdin。請看下面的腳本,等待你的上游C程序進入它已寫入的數據塊的文件名,並刷新到磁盤:

while true() 
    % wait for upstream process to enter filename 
    filename = input('', 's'); 
    % quit means we're done 
    if strcmp(filename, 'quit') 
     quit() 
    end 
    % run secondary processing as instructed 
    process_chunk(filename); 
end 

C程序可以簡單的寫一個數據文件的名稱stdout。在寫完最後一個塊之後,它甚至可以通過說quit告訴MATLAB腳本終止。實際上,C程序看起來可能如下所示:爲了使兩者協同工作,C程序必須「輸入」MATLAB進程。如果C程序被命名爲foo和腳本是bar.m,你把它們連在一起就像這樣:

$ foo | matlab -nojvm -nodisplay -r bar 

我只是測試這對MATLAB R2013a(8.1.0.604),但我不會感到驚訝,如果input有一直在聽stdin很長一段時間,如果這在幾乎任何版本的MATLAB的Linux上都可以使用。

0

Mathworks提供了一些文檔和示例代碼,介紹如何從Documentation Center中的C,C++和Fortran調用Matlab。看起來你可以設置Matlab變量並傳入任意字符串,然後從其他變量中讀取結果。

如果你確實要寫入Matlab的stdinstdout,可能是最清晰的方式是:

  1. 呼叫pipe(2)兩次,以創建一個讀/寫對管子連接到Matlab的stdin和stdout。
  2. 致電fork(2)創建一個新的子進程。
  3. 在子進程,使用dup(2)
    1. 複印一個管在文件描述符0(stdin)的讀端,和
    2. 複製寫入另一管的過度文件描述符1端部( stdout)。
  4. 讓孩子通話execve(2)調用Matlab的

父,現在可以寫命令到第一管,他們將被送到Matlab的。取決於您打開和寫入管道的方式,您可能必須在每個命令之後調用flush。第二個管道連接到Matlab的stdout,將捕獲Matlab輸出的文本。

我不確定Matlab是否向stderr發送了任何東西。如果是,並且想要捕獲它,請創建與stderr(文件描述符2)關聯的第三個管道。否則,它將轉到您的原始程序的stderr,這可能會或可能不是您想要的。

我沒有使用Matlab的C/C++接口,但我猜測使用它可能比試圖解析Matlab的輸出更容易。