下載本文檔
版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、摘要:許多工程軟件需要用到復(fù)雜的數(shù)學(xué)算法。VC+能夠形成各種用戶(hù)界面,并 可以直接與系統(tǒng)及底層硬件交換數(shù)據(jù)。因此研究VC+和Matlab的混合編程具有 很大的實(shí)際意義。該文討論了如何使用Matlab的Complier將*.m函數(shù)編譯為動(dòng)態(tài)鏈接庫(kù)DLL,提供給VC+調(diào)用的方法,提供了一種VC+與Matlab混合編 程的快速實(shí)現(xiàn)。關(guān)鍵詞: Matlab VC+ MCC Complier 動(dòng)態(tài)鏈接庫(kù) DLLMatlab 作為當(dāng)今世界上應(yīng)用最為廣泛的數(shù)學(xué)軟件,具有非常強(qiáng)大的數(shù)值計(jì)算、 數(shù)據(jù)分析處理、系統(tǒng)分析、圖形顯示甚至符號(hào)運(yùn)算的功能。已經(jīng)在如生物工程, 圖像處理,語(yǔ)音處理,雷達(dá)探空,聲納探水,地震探
2、地,以及控制論,系統(tǒng)論等 各個(gè)領(lǐng)域得到廣泛的應(yīng)用。 它是一個(gè)完整的數(shù)學(xué)平臺(tái), 在這個(gè)平臺(tái)上, 用戶(hù)只需 寥寥數(shù)語(yǔ)就可以完成十分復(fù)雜的功能, 大大提高了工程分析計(jì)算、 圖像處理的效 率。但是 Matlab 強(qiáng)大的功能只能在它所提供的平臺(tái)上才能使用,即用戶(hù)必須在 安裝 Matlab 系統(tǒng)的機(jī)器上才能執(zhí)行 *.m 文件。這樣當(dāng)用戶(hù)需要將在 Matlab 下 已開(kāi)發(fā)完畢的復(fù)雜算法應(yīng)用到高級(jí)語(yǔ)言開(kāi)發(fā)環(huán)境下時(shí)就帶來(lái)了問(wèn)題, 是將現(xiàn)成的 東西集成高級(jí)語(yǔ)言開(kāi)發(fā)的程序中呢?還是用高級(jí)語(yǔ)言再重新實(shí)現(xiàn)一遍?顯然大 家所期望的是減少工作量, 最好能將 Matlab 下開(kāi)發(fā)好的程序或函數(shù)直接應(yīng)用到 高級(jí)語(yǔ)言開(kāi)發(fā)的程序中
3、,這就是 Matlab 與高級(jí)語(yǔ)言的混合編程問(wèn)題。VC+是當(dāng)前Windows下的主要編程語(yǔ)言之一,它能方便地形成應(yīng)用軟件中所 需要的各種用戶(hù)界面和工具并直接與系統(tǒng)及底層硬件交換數(shù)據(jù)。用VC+開(kāi)發(fā)的系統(tǒng)具有容易維護(hù)升級(jí)、 界面友好、代碼效率高、 執(zhí)行速度快等一系列優(yōu)點(diǎn), 因 此已成為目前應(yīng)用軟件開(kāi)發(fā)中廣泛采用的主要工具之一因此, 如何將 Matlab 與 VC+進(jìn)行有效的混合編程廣受工程科研人員的關(guān)注。解決這個(gè)問(wèn)題,不僅能更好地發(fā)揮 Matlab 強(qiáng)大的功能,還能快速地進(jìn)行軟件開(kāi)發(fā),尤其是當(dāng)軟件開(kāi)發(fā)中需 要實(shí)現(xiàn)復(fù)雜的數(shù)學(xué)算法、圖形處理時(shí)尤為迫切。研究VC+與Matlab的混合編程具有很大的實(shí)際意
4、義。MATLAB與 Visual C+結(jié)合的方法有多種,但其實(shí)用程度與范圍不同。常用的方 法有:(1) 將Matlab程序編譯成C/C+源文件并嵌入VC+(2) 在 C/C+程序中利用 Matlabengine 調(diào)用 Matlab 函數(shù);(3) 在 C/C+S序中直接使用 Matlab C/C+ Math Library ;(4) 將.m文件編譯成*.dll文件嵌入到VC+的程序中?;趯?shí)用性、易用性的 考慮,本文主要討論第四種方法。另外隨著 Matlab 版本的升級(jí),原來(lái)的 math library 已經(jīng)并入了 Compiler 之中,是否是 mathworks 比較推崇 DLL 的方式呢?
5、 本文通過(guò)一個(gè)簡(jiǎn)單的例子來(lái)說(shuō)明 Matlab和VC+混編的具體過(guò)程(環(huán)境為 Matlab6.5&VC+6.0) 。1 Matlab 編譯環(huán)境的設(shè)置 為了能夠使用Matlab的Complier將*.m函數(shù)文件編譯為動(dòng)態(tài)鏈接庫(kù) DLL,必須 對(duì) Matlab 的環(huán)境做出相應(yīng)的配置。具體做法如下:在 Matlab 的 Comma nd Win dow下 輸入命令 mbuild - setup,并根據(jù) Matlab 的 提示選擇合適的編譯器,筆者使用的是 Microsoft Visual C+ 。過(guò)程如下:>> mbuild -setupPlease choose your com
6、piler for building standalone MATLABapplications:Would you like mbuild to locate installed compilers y/n?Select a compiler:1 Lcc C version 2.4 in D:MATLAB6P5syslcc2 Microsoft Visual C/C+ version 7.0 in C:Program FilesMicrosoftVisual Studio .NET3 Microsoft Visual C/C+ version 6.0 in D:Microsoft Visua
7、l Studio0 NoneCompiler: 3Please verify your choices:Compiler: Microsoft Visual C/C+ 6.0Location: D:Microsoft Visual StudioAre these correct?(y/n):然后,在 Comma nd Win dow中 輸入命令 cd(prefdir);mccsavepath; 這是為了后面 使用Matlab在VC+ IDE中的Add-in 作準(zhǔn)備。然后輸入命令 mex- setup,以 類(lèi)似的方法配置編譯器。 至此, Matlab 的配置完成。 如有疑問(wèn), 可以參閱 Matl
8、ab 的幫助 MatlabCompilerGetting StartedInstallation and configuration 一 節(jié)。2 創(chuàng)建動(dòng)態(tài)鏈接庫(kù)( *.DLL)創(chuàng)建動(dòng)態(tài)鏈接庫(kù)主要有兩種方法: 一種是使用 Matlab 為 VC+IDE 提供的 Add-in 。這種方法比較簡(jiǎn)單, 方便快捷, 只要在VC+中創(chuàng)建工程的時(shí)候選擇 Matlab Project Wizard ,并且在接下來(lái)的 Step 1 中的 Visual Matlab Application Type 選擇 Shared M-DLL 就可以了。 接下來(lái)就是添加 *.m 文件,進(jìn)行編譯了。另一種方法就是使用Matla
9、b的mcc命令將*m文件編譯為動(dòng)態(tài)鏈接庫(kù)(*DLL ) 因?yàn)?Add-in 也是調(diào)用 Compiler 的命令 mcc 進(jìn)行編譯工作的, 而且有時(shí)候這個(gè) Add-in 還會(huì)出現(xiàn)不能使用的情況,因此這里主要討論使用 mcc 命令的方法。關(guān) 于 mcc 有很多參數(shù)可以使用, 而且有多種用法, 具體的可以參見(jiàn) Matlab 的幫助。 這里我們使用命令 mcc-B csglsharedlib:youlibname function1 funcion2 , 來(lái)創(chuàng)建我們所需要的動(dòng)態(tài)鏈接庫(kù) DLL文件。其中參數(shù)-B表示使用的是BundleFiles作為參數(shù),csglsharedlib 是-B的參數(shù),意思是生
10、成使用 Matlab圖形庫(kù) 的C共享動(dòng)態(tài)鏈接庫(kù),youlibname是你想要生成的動(dòng)態(tài)鏈接庫(kù)DLL的文件名, 注意 csglsharedlib 與 youlibname 之間有一個(gè)冒號(hào)“ :” 連接, function1 為 你想要加入到動(dòng)態(tài)鏈接庫(kù) DLL 中的函數(shù)名,如果有多個(gè)函數(shù),各個(gè)函數(shù)名用空 格隔開(kāi)。在我們的例子中, 首先創(chuàng)建所需的 Matlab 函數(shù)文件 myfun.m。function y=myfun(timeend)t=0:0.001:timeend;y=sin(2*pi*50*t);plot(y);然后使用命令 mcc-B csglsharedlib:mylib myfun生成
11、動(dòng)態(tài)鏈接庫(kù) DLL。Matlab 會(huì)生成一系列文件, 其中 mylib.h mylib.lib mylib.dll 以及相同目錄下的 下的 FigureMenuBar.fig 和 FigureToolBar.fig 是我們?cè)谝院笏枰褂玫摹?在VC+沖使用Matlab生成的動(dòng)態(tài)鏈接庫(kù)(*.DLL)為了能在VC+中使用上面生成的*.DLL,首先要對(duì)VC+勺環(huán)境進(jìn)行一些設(shè)置:( 1)設(shè)置 Include 和 Library 目錄在 VC+ IDE 中選擇 Tools->Options->Directories 。在 Show directoris for:中選擇 Include fi
12、les , 添加如下兩個(gè)目錄:<Matlab>externinclude<Matlab>externincludecpp在 Show directoris for:中選擇 Library files , 添加如下兩個(gè)目錄:<Matlab>externlibwin32<Matlab>externlibwin32microsofmsvc6 這里假設(shè)<Matlab>為你的Matlab的安裝目錄。這些操作只需要一次, VC+ IDE 就會(huì)自動(dòng)記錄。自動(dòng)應(yīng)用到每一個(gè)工程( Project )。( 2)工程 (project) 本身的一些設(shè)置在
13、VC+ IDE 中選擇 Project->Setting->C/C+在 Category 中選擇 Code Generation , 在 Use run-time library 中選擇 Multithreaded DLL 。在 Category 中選擇 Precompiled Headers ,選擇 Automatic use of precompiled headers ,并且在 Through header 下面添加 stdafx.h 。在 Category 中選擇 Preprocessor ,在 preprocessor definitions 中添加MSVC,MSWIND
14、,IBMPC在 VC+ IDE 中選擇 Project->Settings->Link在 Categories 中選擇 Input , 在 Ignore libraries: 中填入: msvcrt.lib 。3)為工程添加相應(yīng)的文件把剛才生成的 mylib.h mylib.dll mylib.lib 和 <Matlab>externlibwin32 下的 libmatpm.lib ,<Matlab>externlibwin32microsofmsvc6下的所有*lib 文件復(fù)制到VC+工程的文件夾,并且用 add files to project , 添加
15、的工程中。接下來(lái)就可以使用剛才生成的動(dòng)態(tài)鏈接庫(kù) mylib.dll 了。首先要在使用 DLL 中函數(shù)的源文件中加上頭文件 mylib.h 。在使用之前還需要對(duì) mylib.dll 進(jìn)注冊(cè),使用完畢之后需要對(duì)其進(jìn)行釋放。注冊(cè)使用函數(shù) mylibInitiallize(); 釋放使用函數(shù) mylibTerminate() 。函數(shù)名的規(guī)則就是 youlibname+Initialize(Terminate) 。這兩函數(shù)在 mylib.h 中可以找到。 mylibInitialize() 不僅注冊(cè)了剛才生成的 mylib.dll ,同時(shí)它也注冊(cè)了 Matlab 本身的一些動(dòng)態(tài)鏈接庫(kù)( * . DLL
16、); 同理 mylibTerminate() 不僅釋放了剛才生 成的 mylib.dll ,同時(shí)它也釋放了 Matlab 本身的一些動(dòng)態(tài)鏈接庫(kù) (*.DLL )。因 此在注冊(cè)了 mylib.dll 之后,我們也可以使用 Matlab 的數(shù)學(xué)庫(kù)中的函數(shù), 例 如 mlfabs() , mlfAssign() 等等。在使用mylib.dll 的時(shí)候,存在著一個(gè)VC+和mylib.dll中的函數(shù)之間數(shù)據(jù)交互的問(wèn)題。由于 mylib.dll 中的函數(shù)所接受的參數(shù)是 mxArray 型數(shù)據(jù)。因此我 們要使用 Matlab 為我們提供的 External Interfaces/ API 函數(shù)來(lái)創(chuàng)建 mxA
17、rray 型數(shù)據(jù) , 大量的 API 函數(shù)可以參見(jiàn) Matlab 的幫助文件 MatlabExternal Interfaces/API ReferenceC MX-Functionsx小節(jié)。還有一個(gè)需要注意的問(wèn)題就是原來(lái)的函數(shù)名 myfun 變成了 mlfMyfun ??梢栽?mylib.h 中看到。下面就是一個(gè)實(shí)例/ 包含頭文件 #include “ mylib.h/ 注冊(cè)動(dòng)態(tài)鏈接庫(kù)mylibInitialize();double x=0.04;/ 創(chuàng)建 mxArray 型數(shù)據(jù)并對(duì)其賦值mxArray *t;t=mxCreateDoubleMatrix(1,1,mxREAL); memcp
18、y(mxGetPr(t),&x,sizeof(double);/ 或者使用 t=mxCreateDoubleScalar(x)/ 或者使用 Matlab 數(shù)學(xué)庫(kù)中的函數(shù) mlfAssign() 等/ 使用 mylib.dll 中的函數(shù)mlfMyfun(t);/ 銷(xiāo)毀 t , 釋放內(nèi)存 mxDestroyArray(t);/ 注銷(xiāo)動(dòng)態(tài)鏈接庫(kù) mylibTerminate();4 程序的發(fā)布在程序完成之后, 就可以進(jìn)行打包發(fā)布了。 需要注意的問(wèn)題就是發(fā)布的時(shí)候除了 生成的 mylib.dll 和 FigureMenuBar.fig 、FigureToolBar.fig ,還需要加上 Matlab 的一些動(dòng)態(tài)鏈接。這樣發(fā)布的程序就可以完全脫離 Matlab 的環(huán)境而獨(dú) 立運(yùn)行了。如何得到這些動(dòng)態(tài)鏈接庫(kù)呢?將 <matlab>externlibwin32 下的 mglinstaller
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 感動(dòng)中國(guó)先進(jìn)人物事跡(11篇)
- 開(kāi)展節(jié)能宣傳活動(dòng)總結(jié)
- 愚人節(jié)活動(dòng)策劃(集錦15篇)
- 高中生物教師提升職稱(chēng)答辯題目精 選8題
- 關(guān)于彩虹小知識(shí)
- 2016山西道法試卷+答案+解析
- 超聲引導(dǎo)下坐骨神經(jīng)阻滯聯(lián)合股神經(jīng)阻滯在糖尿病患者膝關(guān)節(jié)以下截肢手術(shù)中的應(yīng)用效果分析
- 產(chǎn)業(yè)研究報(bào)告-中國(guó)糧油行業(yè)發(fā)展現(xiàn)狀、市場(chǎng)規(guī)模、投資前景分析(智研咨詢(xún))
- 二零二五年度航空航天投資理財(cái)合同模板3篇
- 銷(xiāo)售渠道的選擇與管理培訓(xùn)
- 2025民政局離婚協(xié)議書(shū)范本(民政局官方)4篇
- 小學(xué)一年級(jí)數(shù)學(xué)上冊(cè)口算練習(xí)題總匯
- 課題申報(bào)書(shū):GenAI賦能新質(zhì)人才培養(yǎng)的生成式學(xué)習(xí)設(shè)計(jì)研究
- 背景調(diào)查報(bào)告
- 五年級(jí)語(yǔ)文下冊(cè)全冊(cè)教材分析
- 業(yè)主委員會(huì)成員推薦表
- 九年級(jí)下冊(cè)-2023年中考?xì)v史總復(fù)習(xí)知識(shí)點(diǎn)速查速記(部編版)
- GB/T 18103-2022實(shí)木復(fù)合地板
- 《葉圣陶先生二三事》第1第2課時(shí)示范公開(kāi)課教學(xué)PPT課件【統(tǒng)編人教版七年級(jí)語(yǔ)文下冊(cè)】
- 某送電線(xiàn)路安全健康環(huán)境與文明施工監(jiān)理細(xì)則
- GB/T 28885-2012燃?xì)夥?wù)導(dǎo)則
評(píng)論
0/150
提交評(píng)論