馬上要考試啦,而且還要寫報告做實驗,可就是打不起精神來準備。突然想起來寫寫blog,這次想寫的是關于matlab混合編程的東西,以便日后用得著的時候可以方便的查看。
關于為什么要進行matlab的混合編程的原因,現在不想去仔細地調查了,哪天有興致了再寫吧。matlab的混合編程范圍也很廣,包括與C,fortran,Basic等各種高級語言的混合編程,我呢,只對C還稍稍有點認識,就寫C的。
matlab與C的混合編程包括在C中調用matlab和在matlab中調用C。先寫在C中調用matlab吧。在C中調用matlab可以使用matlab引擎,也利用matlab編譯器。嗯,先寫利用matlab編譯器的。
關于這個編譯器的介紹,等考完PLD了,再去仔細地調研一下。這篇呢就從一個簡單的例子來講述一下怎么利用matlab的編譯器來進行混合編程。
首先,啟動matlab,編寫一個簡單的函數M文件,myplot.m:
function myplot()
n = 0:0.01:1;
y = sin(2*pi*n);
plot(n,y)
NOTE:就目前來說,matlab還只支持函數M文件的編譯,而不支持腳本M文件,所以一定要寫成函數M文件。
寫完M文件之后,必須對文件進行編譯。在編譯之前,必須對編譯器進行配置(這個步驟只需進行一次,下次再用時就不用再進行配置了)。配置使用的命令是mbuild -setup。然后按著提示選擇y/n和123就好了。
配置完成之后,就可以進行編譯了。編譯使用的命令是mcc。mcc函數可以帶多種參數,關于各個參數的含義以后再說吧。在這里使用:
mcc -W cpplib:libmyplot -T link:lib myplot.m
Note:這里libmyplot是生成的lib文件的文件名,myplot.m是待編譯的文件。使用這個命令將會生成一序列不同格式的文件,在后面將會利用到。這個過程比較慢,要耐心等待,別以為是程序有問題然后就給關了,呵呵。
這些是用matlab來實現的步驟,下面就要開始用c來調用了。
先要對vc的預編譯路徑進行設置。我用的是VC++6.0,設置的方法是:
在tools\options\directions下的show directions for下的組合框選include files項,添加"%matlab\extern\include",再選擇library files項,添加"%matlab\EXTERN\LIB\WIN32\MICROSOFT"。這里%matlab是matlab的安裝路徑,library files項要根據系統平臺及c語言的開發環境來選擇。這個設置跟前面matlab編譯器的設置一樣,只需要設一次就可以了,建立其它的工程時不用現進行設置。
然后可以開始編程了。這里選用MFC編程。先建立一個基于對話框的工程,接受所有黑夜默認的設置。完成后,將前面編譯生成的.ctf,.dll和.lib文件復制到當前工程路徑下。
對生成的對話框做一些改動,去掉自動生成的“確定”及取消“按鈕”及文本(如果你想留著也沒關系啦),添加"Plot"及"Close"按鈕,并添加其響應函數(雙擊按鈕就會生成的)。
在myplotDlg.cpp文件里添加:
#include myplot.h
在OnInitDialog函數里添加如下:
// Initialize the MCR
if (!mclInitializeApplication(NULL,0))
{
AfxMessageBox(_T("Could not intialize the application."));
return TRUE;
}
// Initialize the matlab library
libmyplotInitialize();
在Plot按鈕的響應函數中,添加:
myplot();
在Close按鈕的響應函數中,添加:
// Terminate the library
libmyplotTerminate();
// Terminate the MCR
mclTerminateApplication();
OnClose();
程序的編寫到這里就OK啦。然后要設置連接選項了。
Project\settings\category選擇Input,在Object/Library modules添加libmyplot.lib mclmcrrt.lib,對Win32 Release和Win32 Debug都進行相同的設置。
這樣的Over了,編譯,鏈接,運行,就可以看到結果了。不過估計是因為要啟動MCR吧,程序的啟動會很慢,耐心等待哦。
最后說一下關于程序的發布問題。之所以進行混合編程,一個很重要的原因就是想讓一些matlab函數可以脫離matlab平臺運行,為了達到這一目的,在發布程序時,除了發布C生成的可執行文件及matlab編譯生成的.ctf,.dll和.lib文件外,還應該同時發布一個MCRInstaller以便沒有matlab平臺的用戶使用。MCRInstaller的生成方法很簡單,使用下面的函數即可:
zipfile = buildmcr(dirname)
該函數將生成MCRInstaller.zip文件,并將該文件保存到dirname指定的路徑下,zipfile返回的是完整的路徑名。
這樣就可以發布程序了。沒有matlab平臺的用戶在使用時,應該先將MCRInstaller.zip解壓到本地的某一路徑下,并將其中的可執行文件所在的路徑(應該是在bin文件夾底下)添加到系統環境變量中。
Note:添加系統環境變量的方法
在我的電腦上右鍵,選擇屬性,再選擇高級子菜單,點擊環境變量按鈕,并點擊彈出對話框中系統變量對應的新建按鈕,變量名可以自定義,變量值就是前面得到的路徑。
這樣就徹底地結束了,不過我沒有在沒有matlab平臺的電腦上測試過,哪位測試過的告訴我一下結果。