李 雯
(寶雞職業(yè)技術(shù)學(xué)院電子信息工程系,721000)
?
Matlab與VC混合編程的方法研究
李 雯
(寶雞職業(yè)技術(shù)學(xué)院電子信息工程系,721000)
摘要:Matlab與VC是應(yīng)用范圍較廣的編程語言,將二者進(jìn)行混編是計算機(jī)軟件領(lǐng)域人士一直思考的重要課題。本文就如何實(shí)現(xiàn)二者的完美結(jié)合進(jìn)行了深入的探討。
關(guān)鍵詞:Matlab;VC;混合編程
Matlab,其全稱為MATrix LABoratory,中文翻譯為矩陣實(shí)驗(yàn)室,它是由美國The MathWorks公司出品的商業(yè)數(shù)學(xué)軟件,其主要功能是數(shù)值計算,而VC語言作為系統(tǒng)設(shè)計語言,在編寫計算機(jī)程序時有著廣泛的應(yīng)用,然而,Matlab與VC語言由于各種原因的限制導(dǎo)致二者之間的編程無法共存,這給開發(fā)者帶來了不小的麻煩。近年來隨著編程方法的日益成熟,二者之間互不兼容的現(xiàn)象得到了改善,特別是Matlab2010的研發(fā)不僅保存了傳統(tǒng)的Matlab7.0編譯器基本構(gòu)架穩(wěn)定的優(yōu)勢,而且開發(fā)了新的功能,使得混編程序向下兼容性越來越好,但二者混編以后仍然會出現(xiàn)結(jié)構(gòu)不穩(wěn)定的現(xiàn)象?;炀幵O(shè)計都要遵循一定的原則,有著固定的混編方法,因此在進(jìn)行混編時,只要掌握了一定的方法都可以按照需要選擇不同的混編模式。筆者經(jīng)過長期的實(shí)踐,發(fā)現(xiàn)了以下三種方法進(jìn)行混編會取得良好的效果
Matlab編譯器可將Matlab程序編譯為獨(dú)立可執(zhí)行程序,通過修改接口文件的方式實(shí)現(xiàn)在C/C++中調(diào)用Matlab文件。生成獨(dú)立運(yùn)行的Matlab程序是使用Matlab編譯器編譯的文件最常用的一種方式。Matlab編譯器的主要功能是將Matlab程序編譯成其他語言可以調(diào)用的模塊或元素。Matlab編譯器的主要功能是將Matlab程序編譯為可執(zhí)行程序或者動態(tài)鏈接庫,經(jīng)過編譯后的可執(zhí)行程序可以所有的計算機(jī)中運(yùn)行,不管這臺計算機(jī)是否安裝了Matlab軟件,而編譯后的動態(tài)鏈接庫則成為C/C++開發(fā)人員的工具,使他們在任何一臺計算機(jī)中完成軟件的開發(fā)工作。除此之外架構(gòu)在Matlab編譯器之上的Matlab Builder NE工具箱可以將Matlab程序編譯為Com組件供第三方程序調(diào)用。
傳統(tǒng)的Matlab 6.5以及以前的編譯器都將研究的重點(diǎn)放在了如何實(shí)現(xiàn)Matlab程序與C/C++程序之間的轉(zhuǎn)化,而Matlab 7.0及其以后的編譯器打破了這種觀念的桎梏,將MCR技術(shù)引用到設(shè)計中,將開發(fā)的重點(diǎn)放在了Matlab程序編譯為MCR可執(zhí)行的程序。MCR是Matlab提供的一組動態(tài)鏈接庫,可以說是簡化版的Matlab,它支持Matlab語言的所有特征,這就意味著所有的Matlab程序都可以在MCR中得到編譯,這樣即使計算機(jī)未安裝Matlab也可以執(zhí)行Matlab程序。
Matlab編譯器最常見的應(yīng)用就是將其編譯為獨(dú)立可執(zhí)行文件。采用MCC命令的-m選項(xiàng)可以將*.m函數(shù)文件直接編譯為獨(dú)立可執(zhí)行文件。動態(tài)鏈接庫的編譯過程與獨(dú)立可執(zhí)行文件的編譯過程類似,可以有兩種方法將*.m函數(shù)文件編譯為動態(tài)鏈接庫。①采用MCC編譯選項(xiàng);②采用捆綁命令文件。
Matlab作為一個頗受歡迎的數(shù)學(xué)軟件,包括了多種數(shù)學(xué)運(yùn)算程序,這樣當(dāng)用戶需要數(shù)值運(yùn)算的時候就可以運(yùn)用Matlab引擎使用Matlab中的運(yùn)算公式進(jìn)行計算。Matlab的界面部分是由C/C++語言組成的,為用戶的使用提供了方便。
Matlab中蘊(yùn)含著大量的API函數(shù)用于支撐Matlab操作的實(shí)現(xiàn),這些函數(shù)都以eng開頭,因此掌握eng函數(shù)是實(shí)現(xiàn)Matlab 與V C++語言順暢兼容的前提和基礎(chǔ)。具體操作流程如下:
2.1Engine * engOpen(coust char * startcmb)
啟動Matlab引擎時要注意其操作環(huán)境,如果操作環(huán)境為Windows的話,就必須要將startcmd參數(shù)設(shè)置為NULL。
2.2int engClose(Engine * ep)
關(guān)閉Matlab引擎。
2.3int engEvalString ( Engine * ep , const char * string )
使 Matlab 引擎執(zhí)行字符串 string中的表達(dá)方式
2.4int engPutVariable (Engine * ep , const char * nane , const mxArray * mp )
向Matlab引擎工作空間中引入一個新的Matlab 陣列變量,name選項(xiàng)這一欄填寫為引入Matlab中的名字。
2.5mxArry * engGetVariable ( Engine * ep , const
char * name )
從Matlab 引擎工作空間中復(fù)制名稱為 name 的變量。
2.6int engGetVisible ( Engine * ep , bool * value )
判斷Matlab引擎工作窗口是否可見。
C/C++通過Matlab引擎調(diào)用Matlab程序的這種方法必須要在計算機(jī)中存有Matlab軟件的環(huán)境下才能實(shí)現(xiàn),脫離了這個環(huán)境,就無法實(shí)現(xiàn)C/C++語言與Matlab程序的兼容。
通過Matlab編譯器的mcc 命令,可以將Matlab * ·m文件直接編譯為動態(tài)鏈接庫以供Visueil C++ 調(diào)用,以Plotsinc 函數(shù)為例,采用命令mcc-B csharedlib :libsincplot Sincplot ·m 將其編譯為動態(tài)鏈接庫。接著,創(chuàng)建一個 Visual C++ 單文檔的工程 testsincplot-dll ,然后通過選擇project settings link input菜單選項(xiàng)將庫文件libsincplot.lib、mclmcrrt. lib加入到Visual c++6.0工程中 ,其中l(wèi)ibsincplot.lib為上述步驟中由Matlab編譯器生成的文件之一。
將libsincpiot.dll復(fù) 制 到Windows系 統(tǒng) 目 錄 或 者testsincpiot_dll工程的debug目錄下,將libsincplot.h、libsincplot.lib文件拷貝到testsincpiot_dll工程的源文件目錄下,并將其libsincplot.h文件添加到工程中。
Matlab與C/C++混合程序設(shè)計的實(shí)踐性和技巧性較強(qiáng),本文介紹了混合編程的三種方法,具體應(yīng)用還要結(jié)合開發(fā)者的具體情況進(jìn)行選擇,希望對從事程序開發(fā)讀者有所幫助。
參考文獻(xiàn)
[1]劉維著. 精通Matlab與c/c++混合程序設(shè)計[M]. 北京航空航天大學(xué)出版社
[2] 張亮,王繼陽著. MATLAB與c/c++混合編程[M]. 人民郵電出版社出版
課題名稱:省職教學(xué)會的課題《基于VC和MATLAB的仿真實(shí)驗(yàn)平臺的設(shè)計》
課題編號:SZJYB2015033
Matlab and VC mixed programming method
Li Wen
(Baoji professional technology institute,Department of electronic and information engineering,721000)
Abstract:Matlab and VC is the programming language has a wide application scope,will be to mix both people in the field of computer software has been a important subject.In this paper,how to achieve the perfect combination of the two had in-depth discussion.
Keywords:Matlab;VC;Mixed programming