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