2010-03-14 60 views
0

我在linux下編寫了一個自動分級程序。有幾個在MATLAB中編寫的評分程序,所以我想將它們全部綁在一起,並讓學生運行程序來完成作業,並讓他們選擇作業。我正在使用C++主程序,然後將mcc編譯的MATLAB庫鏈接到它。MATLAB任意代碼執行

具體來說,我的程序讀取了各種matlab程序名稱和其他信息的配置文件。然後它使用該信息向學生呈現選擇。所以,如果一個任務改變,被添加或刪除,那麼你所要做的就是改變配置文件。

這個想法是,接下來,程序調用已經用mcc編譯的正確的matlab庫。但是,這意味着如果分級機構發生變化,庫必須重新編譯。更糟糕的是,如果添加或刪除平地機,整個程序必須重新編譯。所以,我希望一個簡單的,不變的matlab庫函數直接調用分級器m文件。我目前有這樣一個庫,它使用從主程序傳遞給它的字符串的eval。

問題是,當我這樣做時,顯然,mcc吸收了分級器m代碼本身;編譯後更改分級器m代碼不起作用。我想這不會發生。它引起了我的注意,Mathworks可能不希望我能夠做到這一點,因爲它可以完全繞過matlab。這不是我的意圖,我會很高興需要完整的matlab安裝解決方案。

我可能的解決方案是爲主程序使用mex文件,或讓主程序調用mcc庫,然後調用mex文件,然後調用適當的分級器。我對第一種解決方案猶豫不決的原因是,我不確定我需要對代碼進行多少更改才能使其工作;我的代碼是C++,而不是C,我認爲這會讓事情變得更加複雜。然而,第二種解決方案可能會更加複雜,並最終會遇到同樣的問題。

那麼,對這種情況有什麼想法?我應該怎麼做?

回答

0

不要使它成爲一個mex函數。

使用必須在matlab中執行的常規m文件。如果你不想首先啓動matlab,寫一個bat文件。我相信-r或-m運行給定的命令(在運行ml函數之前,您將不得不cd到正確的目錄)。

要使用mex編譯C++代碼,首先安裝visual studio。然後運行(在matlab中)mex -setup。選擇「找到已安裝的編譯器」或其他,然後從列表中選擇你的編譯器。現在mex將編譯C++代碼。

2

你似乎已經選擇解決問題的最複雜的方式。以下是一些備選:

  1. 不要使用C/C++的話 - 寫MATLAB程序,以顯示選項菜單(無論是在MATLAB命令窗口中一個簡單的文本菜單GUI),然後調用適當的MATLAB分級程序。

  2. 在C/C++中編寫菜單程序,但使用-r參數調用MATLAB來運行特定的分級程序(以加快啓動時間,根據需要使用-nodesktop,-nojvm或-nodisplay選項) 。但是,請注意,MATLAB將在每個菜單選項上重新啓動。

  3. 用C/C++編寫你的菜單程序,並使用popen命令啓動MATLAB(這在你的C++程序和MATLAB過程之間建立了一個管道)。用戶選擇菜單後:

    • 您的C++程序將MATLAB程序(以及任何參數)的名稱寫入管道。
    • 在MATLAB方面,編寫一個MATLAB程序到該管道上的阻塞讀取。當它讀取一個命令時,它會調用相應的MATLAB函數。
    • 您也可以使用named pipes。有關更多信息,請參閱此MATLAB newsgroup thread

更新:選項#3上面實際上是如何MATLAB engine的作品,所以你可能會更好過直接使用。