




已閱讀5頁(yè),還剩42頁(yè)未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
常用數(shù)學(xué)軟件選講,2,VC與Matlab接口編程,如果在CC+語(yǔ)言中能用MATLAB那么簡(jiǎn)單的代碼來(lái)實(shí)現(xiàn)該功能就可以大大減少工作量,VC和MATLAB接口就是做這個(gè)工作的。 利用MATLAB的編譯工具將m文件方便的轉(zhuǎn)化為CC+語(yǔ)言、可執(zhí)行程序(exe)、動(dòng)態(tài)連接庫(kù)文件(dll)、COM組件等等,并可直接供CC+語(yǔ)言調(diào)用,利用VC和MATLAB接口技術(shù)可以在VC中充分發(fā)揮MATLAB的數(shù)值計(jì)算功能,并且可以不依賴(lài)MATLAB軟件運(yùn)行。 我們?cè)诰帉?xiě)程序時(shí),可以在VC下做出很漂亮的界面,而把復(fù)雜的數(shù)值處理交給MATLAB去做(實(shí)際上MATLAB也能做界面GUI(Graphic User Interface),而且做出的界面并不比VC遜色,但是需要MATLAB軟件作為后臺(tái)運(yùn)行,如果不依賴(lài)MATLAB軟件運(yùn)行的話,可以在VC中調(diào)用GUI),然后通過(guò)接口技術(shù)將MATLAB集成到VC中,這樣可以大大減輕編程的負(fù)擔(dān),并減少程序編寫(xiě)時(shí)間。,3,VC與Matlab接口編程,Matlab Engine方式 Matlab CC+函數(shù)庫(kù)(7.0后不建議使用,略) Matlab自帶的Matlab Compiler Matcom技術(shù) COM組件接口方法 (Visual C+6.0 Matlab 6.5),4,Matlab Engine方式,Matlab Engine是指一組Matlab提供的接口函數(shù),支持C語(yǔ)言, Matlab Engine采用C/S(客戶(hù)機(jī)/服務(wù)器)模式,Matlab作為后臺(tái)服務(wù)器,而C程序作為前臺(tái)客戶(hù)機(jī),通過(guò)Windows的動(dòng)態(tài)控件與服務(wù)器通信,向Matlab Engine傳遞命令和數(shù)據(jù)信息,從Matlab Engine接受數(shù)據(jù)信息。用戶(hù)可以在前臺(tái)應(yīng)用程序中調(diào)用這些接口函數(shù),實(shí)現(xiàn)對(duì)Matlab Engine的控制。采用這種方法幾乎能利用Matlab全部功能,但是需要在機(jī)器上安裝Matlab軟件,而且執(zhí)行效率低,因此在實(shí)際應(yīng)用中不采用這種方法,在軟件開(kāi)發(fā)中也不可行,適合個(gè)人使用或做演示用。,5,Matlab自帶的Matlab Compiler,Matlab Compiler的作用是將m文件轉(zhuǎn)化成C/C+代碼(也就是通常所用的mcc命令),這種源代碼需要用C/C+編譯器編譯連接成獨(dú)立應(yīng)用程序,在將m文件轉(zhuǎn)成獨(dú)立應(yīng)用程序的過(guò)程中生成的C/C+文件,原則上是可以被其它的C/C+代碼調(diào)用的,編譯器可以通過(guò)設(shè)置mcc命令的選項(xiàng),將m文件編譯成動(dòng)態(tài)鏈接庫(kù)文件、C/C+文件、可執(zhí)行文件等一系列文件。到matlab R12.1為止,Matlab Compiler的m程序轉(zhuǎn)換成C/C+代碼功能有很多限制: 不能轉(zhuǎn)換腳本m文件,只能轉(zhuǎn)換m函數(shù); 不能使用matlab對(duì)象; 不能用input或者eval操作matlab空間變量; 不能動(dòng)態(tài)地命名變量,然后用load或者save命令來(lái)操作; 不能處理具有嵌套調(diào)用其他m文件的m文件; 不能使用MATLAB內(nèi)聯(lián)函數(shù);,6,1、必須保證編譯器的正確配置,因?yàn)榫幾g器使用了CC+庫(kù)函數(shù),所以在使用前需要使用 mex -setup 和 mbuild -setup 兩個(gè)命令對(duì)編譯器進(jìn)行配置, 如果以前已經(jīng)進(jìn)行了配置就不 需要這一步。,動(dòng)態(tài)鏈接庫(kù)方式,7,mbuild -setup,8,9,2、設(shè)置頭文件和庫(kù)文件的路徑,配置完成如圖1和圖2,10,3、在MATLAB打開(kāi)文本編輯器(File-New-M-file)寫(xiě)一個(gè)簡(jiǎn)單的m函數(shù): function y=huatu_test() x=-10:0.1:10; y=sin(x); plot(x,y,*) 文件保存為huatu_test.m。 4、在MATLAB命令窗口用如下命令生成dll文件和調(diào)用dll所需要的文件: mcc -t -W libhg:dlltest -T link:lib -h libmmfile.mlib huatu_test.m 生成的文件將會(huì)保存在當(dāng)前目錄下,默認(rèn)的當(dāng)前目錄為:MATLAB根目錄work,找到dlltest.h 、dlltest.lib和dlltest.dll文件,這三個(gè)文件是我們需要的。 5、在VC中新建一個(gè)名為ceshi基于對(duì)話框的工程,在工程中添加一個(gè)名為“測(cè)試“的button按鈕。將dlltest.h 、dlltest.lib和dlltest.dll文件拷貝到當(dāng)前工程目錄下,并通過(guò)Project-Add To Project-Files 選擇拷貝到當(dāng)前目錄下的三個(gè)文件,將文件引入工程。,11,6、在ceshiDlg.cpp文件中添加頭文件dlltest.h #include “dlltest.h“ 打開(kāi)dlltest.h文件,里面有有關(guān)函數(shù)的定義,找到其中三個(gè)函數(shù): extern mxArray * mlfHuatu_test(void); extern void dlltestInitialize(void); extern void dlltestTerminate(void); 從函數(shù)意思不難知道它們的作用,dlltestInitialize用來(lái)初始化dll庫(kù),dlltestTerminate用來(lái)結(jié)束調(diào)用dll,mlfHuatu_test為主程序執(zhí)行函數(shù)。將三個(gè)函數(shù)拷貝到button響應(yīng)代碼中,進(jìn)行修改: void CCeshiDlg:OnButton1() dlltestInitialize(); mlfHuatu_test(); dlltestTerminate(); ,12,編譯、執(zhí)行程序,點(diǎn)擊結(jié)果如圖,13,可以看出,相比VC編寫(xiě)dll文件,利用MATLAB 編譯器生成dll文件,以及在VC中調(diào)用該dll文件要方便和簡(jiǎn)單的多。利用編譯器還可以根據(jù)需要生成CC+源文件,可執(zhí)行文件等。MATLAB6.5的編譯器為3.0版本,MATLAB7.0的編譯器為4.0版本,4.0版本的編譯器對(duì)原編譯器進(jìn)行了很多改進(jìn),3.0很多方法都不再使用,上述方法如果在7.0版本上使用會(huì)出現(xiàn)錯(cuò)誤。 利用mcc命令,通過(guò)不同的參數(shù)設(shè)置可以生成不同的文件,例如: mcc -B sgl myfun 將myfun.m文件生成對(duì)應(yīng)的c文件和使用c圖形庫(kù)的可執(zhí)行程序 mcc -B sglcpp myfun 將myfun.m文件生成相應(yīng)的c+文件和使用c+圖形庫(kù)的可執(zhí)行程序 (如果自己編寫(xiě)的程序圖形不能顯示菜單欄和工具欄,拷貝文件夾bin到當(dāng)前目錄下),14,利用編譯器將m文件轉(zhuǎn)換成對(duì)應(yīng)的CC+文件,并在VC中調(diào)用,首先要保證編譯器設(shè)置正確,編譯器的設(shè)置可以參考前面兩節(jié)的內(nèi)容。如果以前已經(jīng)進(jìn)行了配置就不需要這一步。 1、在MATLAB中編寫(xiě)如下函數(shù): function x=gjfcz(A,b) %A=-1.5 1 2; 4 2 3 ; -3 2 8 %b=3;5;6 x=Ab 保存名為gjfcz.m,該函數(shù)的功能為求解線形方程組。 2、在MATLAB的命令窗口輸入以下命令:mcc -m gjfcz.m 該命令用來(lái)生成對(duì)應(yīng)的C文件和可執(zhí)行程序。在MATLAB工作目錄下(一般是MATLABwork)將會(huì)生成如下文件:gjfcz.exe,gjfcz.c,gjfcz.h,gjfcz_main.c,其中g(shù)jfcz.c,gjfcz.h是我們需要的文件。,15,Matcom 簡(jiǎn)介,這是個(gè)第三方控件,很小(8M多),原本屬于mathtool公司,后來(lái)被Mathworks公司合并了,使用該工具可以將m腳本文件和m函數(shù)轉(zhuǎn)化成相同功能的CC+文件,相比其它方法使用matcom具有如下優(yōu)點(diǎn): 轉(zhuǎn)換過(guò)程簡(jiǎn)單(由matcom工具自動(dòng)實(shí)現(xiàn)),容易實(shí)現(xiàn); 可以方便的生成動(dòng)態(tài)鏈接庫(kù)文件(dll)和可執(zhí)行文件(exe); 不僅可以轉(zhuǎn)換獨(dú)立的腳本文件,也可以轉(zhuǎn)換嵌套腳本文件; 設(shè)置環(huán)境后,可以使用Matlab的工具箱函數(shù); 但matcom也有以下不足: 對(duì)struct等類(lèi)的支持有缺陷,對(duì)class數(shù)據(jù)類(lèi)型; 部分繪圖語(yǔ)句無(wú)法實(shí)現(xiàn)或得不到準(zhǔn)確圖象,尤其是三維圖象;,16,相比Matlab自帶的編譯器Compiler,用Matcom轉(zhuǎn)化代碼要簡(jiǎn)單和方便得多。 本節(jié)將以VC6.0和Matcom為例,詳細(xì)介紹如何利用Matcom進(jìn)行VC與Matlab的聯(lián)合編程。,Matcom 簡(jiǎn)介,17,Matcom安裝,安裝Matcom前要已求安裝VC6.0。 Matcom可以獨(dú)立于Matlab運(yùn)行,但需要外部的C+編譯器,在安裝時(shí)指定Matlab的位置是為了讓編譯文件中需要的一些系統(tǒng)函數(shù)找到路徑。,18,安裝完成后,啟動(dòng)界面MIDEVA(下圖)。MIDEVA集成開(kāi)發(fā)環(huán)境包括命令行窗口、變量列表窗口、命令列表窗口和編譯鏈接信息窗口等幾部分,并有詳細(xì)的幫助文檔,19,Matcom命令輸入方法與Matlab相同。如果安裝在中文版操作系統(tǒng)時(shí),輸入命令前加一空格。(下圖),20,m文件編譯后放入VC中,1、啟動(dòng)MIDEVA ,File-New,新建如下Test1.m文件: x=1:0.1:10; y=sin(x); plot(x,y); 將文件保存(如下圖)。,m文件保存的默認(rèn)位置為:matcom安裝目錄matcom45,生成的C+文件保存的默認(rèn)位置為:matcom安裝目錄matcom45Debug,本例matcom安裝目錄為C盤(pán) 即 C:matcom45Debug,在該目錄下將會(huì)產(chǎn)生Test1.h、Test1.cpp、Test1.r 、Test1.obj文件。,21,2、在VC中用MFC Wizard(exe)創(chuàng)建一個(gè)基于對(duì)話框名為Example的工程。 在面板上添加一個(gè)ID為IDC_BUTTON1按扭。 3、將C:matcom45Debug目錄下的Test1.cpp文件的內(nèi)容拷貝到 void CExamleDlg:OnButton1()下,22,4、將C:matcom45lib下的matlib.h 和v4501v.lib文件和C:matcom45debug下的Test1.h文件拷貝到工程Example目錄下,然后在VC中將庫(kù)文件和頭文件加入到工程中:工程-添加工程-Files,選擇剛剛拷貝到Example目錄下的matlib.h 、v4501v.lib和Test1.h文件,23,5、在ExamleDlg.cpp中加入如下代碼: #include “matlib.h“ #include “Test1.h“ 6、在void CExamleDlg:OnButton1()中分別添加一個(gè)初始化類(lèi)庫(kù)調(diào)用函數(shù)”initM(MATCOM_VERSION)”和一個(gè)結(jié)束類(lèi)庫(kù)調(diào)用函數(shù)”exitM()”,24,運(yùn)行程序,點(diǎn)擊畫(huà)圖按扭,程序的release版本需要ago4501.dll、v4501v.dll、v4501.lib三個(gè)文件的支持。,25,在VC中調(diào)用matcom編譯后的函數(shù),首先新建一個(gè)函數(shù)huatu.m,該函數(shù)的功能是:接受用戶(hù)輸入的左端點(diǎn)值和右端點(diǎn)值兩個(gè)輸入?yún)?shù),然后在該區(qū)間畫(huà)正弦圖形。函數(shù)還將生成兩個(gè)隨機(jī)數(shù),作為一個(gè)點(diǎn)的坐標(biāo)在圖中打印出來(lái)(綠點(diǎn)),用來(lái)說(shuō)明如何在VC中處理調(diào)用函數(shù)的返回值。,26,1建立一個(gè)名為Example2基于對(duì)話框的MFC(exe)工程。 2在matcom中新建一個(gè)名為huatu.m文件,27,3.在matcom命令窗口中運(yùn)行該函數(shù),28,4將生成的huatu.h、huatu.cpp(默認(rèn)位置為 安裝目錄:matcom45samplesDebug)和matlib.h、v4501v.lib(默認(rèn)位置為 安裝目錄:matcom45lib)四個(gè)文件拷貝到建立的工程Example2目錄下。 5將第四步拷貝的四個(gè)文件加入到VC工程中:工程-添加工程-文件,選擇剛才拷貝到Example2目錄下的四個(gè)文件。完成后如圖,29,6在Example2dlg.cpp中添加頭文件: #include “matlib.h“ #include “huatu.h“,30,7為工程建立界面:添加一個(gè)Button按扭控件;添加四個(gè)Edit box控件,用于顯示數(shù)據(jù);添加五個(gè)Static text控件,四個(gè)顯示文字,一個(gè)顯示圖形,將顯示圖形的Static text的ID設(shè)置為ID_PIC。其他所有控件屬性保持默認(rèn),31,8按Ctrl+W為控件添加變量。,32,9為Button1按鈕添加響應(yīng)代碼。,33,10運(yùn)行程序,輸入左端點(diǎn)和右端點(diǎn),點(diǎn)擊”畫(huà)圖”按鈕,結(jié)果如圖,34,注:如果在編譯中出現(xiàn)下列錯(cuò)誤: fatal error C1010: unexpected end of file while looking for precompiled header directive 進(jìn)行下列設(shè)置:工程-設(shè)置- C/C+ 選擇precompiled headers 選擇第一或第二項(xiàng):自動(dòng)選擇預(yù)補(bǔ)償頁(yè)眉,如圖,35,COM接口方法,COM是component object module的簡(jiǎn)稱(chēng),它是一種通用的對(duì)象接口,任何語(yǔ)言只要按照這種接口標(biāo)準(zhǔn),就可以實(shí)現(xiàn)調(diào)用它。matlab6.5新推出來(lái)的combuilder就是把用matlab編寫(xiě)的程序做成com組件,供其他語(yǔ)言調(diào)用。該方法實(shí)現(xiàn)簡(jiǎn)單,通用性強(qiáng),而且?guī)缀蹩梢允褂肕atlab的任何函數(shù)(注意:不支持腳本文件,腳本文件使用時(shí)要改為函數(shù)文件),因此在程序較大、調(diào)用工具箱函數(shù)或調(diào)用函數(shù)較多時(shí)推薦使用,這也是Matlab公司(Matlab公司就是Mathworks公司)推薦的使用方法。,36,1:在Matlab編輯器里編輯m函數(shù)文件:?jiǎn)?dòng)matlab-File-New-M-file 函數(shù)內(nèi)容如圖:該函數(shù)無(wú)輸入輸出參數(shù),文件保存為huatu.m,37,在matlab下建立COM組件,步驟如下: 1、在matlab command window 輸入如下命令: comtool 出現(xiàn)com編輯界面,如圖,38,2、新建工程:File-New Project,如圖(左),3、設(shè)置組件屬性,在“Component name”項(xiàng)中填寫(xiě)組件名稱(chēng)“component”,這時(shí)候會(huì)自動(dòng)生成類(lèi)“component”,在“Class name”項(xiàng)中填寫(xiě)類(lèi)名稱(chēng)“huatu”,如圖(右),39,為了便于區(qū)分,選中“Classes“中的“component“,點(diǎn)擊“remove”按鈕,將類(lèi)component移除,再點(diǎn)擊“Add“添加新類(lèi)huatu,結(jié)果如圖5。點(diǎn)擊“OK“,接下來(lái)出現(xiàn)一個(gè)對(duì)話框,選擇“Yes“.,40,4. 添加文件:選中左邊工作區(qū)的“huatu“,點(diǎn)擊Project-Add File,選擇已經(jīng)編輯好的函數(shù)文件huatu.m,如圖6。需要注意的是m文件必須是m函數(shù),否則會(huì)報(bào)錯(cuò),如果是m腳本文件的話,只需要改為無(wú)輸入輸出參數(shù)的m函數(shù)即可。,41,5、生成 com組件:點(diǎn)擊Build-COM Object,結(jié)果如圖,42,com組件已經(jīng)由matlab做好,默認(rèn)的保存位置為:matlab安裝位置workcomponent。 VC中調(diào)用COM組件,步驟如下: 1
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025建筑工程監(jiān)理委托合同
- 2025股權(quán)轉(zhuǎn)讓合同
- 初三學(xué)生國(guó)旗下演講稿《輕裝上陣迎中考 志存高遠(yuǎn)勇拼搏》
- 運(yùn)維服務(wù)管理優(yōu)化匯報(bào)
- 模擬有限責(zé)任公司設(shè)立登記流程
- 膿胸的護(hù)理常規(guī)
- 2025年環(huán)境監(jiān)測(cè)測(cè)驗(yàn)試題
- 公司財(cái)務(wù)報(bào)銷(xiāo)費(fèi)用培訓(xùn)
- 2025年中醫(yī)執(zhí)業(yè)醫(yī)師考試中藥學(xué)知識(shí)點(diǎn)總結(jié)模版
- 新質(zhì)生產(chǎn)力日?qǐng)?bào)
- 分子氧氧化丙烯制環(huán)氧丙烷銅基催化劑的制備及性能研究
- 經(jīng)營(yíng)書(shū)院合作協(xié)議書(shū)
- 人教版五下-6.1 同分母分?jǐn)?shù)加減法(教學(xué)課件)
- 倉(cāng)庫(kù)新員工入職培訓(xùn)模板
- 2025年入團(tuán)考試必考題目試題及答案
- 人工智能訓(xùn)練師(三級(jí))職業(yè)技能鑒定理論考試題(附答案)
- 私人月嫂合同協(xié)議書(shū)下載
- 商標(biāo)基礎(chǔ)知識(shí)試題及答案
- GB/T 10069.3-2024旋轉(zhuǎn)電機(jī)噪聲測(cè)定方法及限值第3部分:噪聲限值
- 知道智慧網(wǎng)課《科技倫理》章節(jié)測(cè)試答案
- 【真題】2023年常州市中考道德與法治試卷(含答案解析)
評(píng)論
0/150
提交評(píng)論