VC++與MATLAB接口編程方法與實現(xiàn)_第1頁
VC++與MATLAB接口編程方法與實現(xiàn)_第2頁
VC++與MATLAB接口編程方法與實現(xiàn)_第3頁
VC++與MATLAB接口編程方法與實現(xiàn)_第4頁
VC++與MATLAB接口編程方法與實現(xiàn)_第5頁
已閱讀5頁,還剩6頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

1、VC+與MATLAB接口編程方法與實現(xiàn)摘要本文簡介了V+和ATLAB特點,討論了ATLAB與V+接口編程的三種方法,并詳細闡述了和組件接口編程的方法和實現(xiàn)過程。研究說明:采用V+和ATLAB接口編程方法降低了編程難度,較好地發(fā)揮了兩者各自的優(yōu)勢。關鍵詞ATLAB;V+;接口編程ATLAB是美國athrks公司研制開發(fā)的一種科學計算軟件,它將高性能的數(shù)值計算、符號計算和可視化集成在一起,并提供了大量的內(nèi)置函數(shù)以及功能豐富的工具箱,使用方便,編程效率高。然而,ATLAB是一種解釋性語言,運行效率低,不合適作為通用的編程平臺。V+是irsft公司推出的一個基于inds平臺的可視化的集成開發(fā)環(huán)境,在運

2、行速度、功能性以及應用程序界面開發(fā)方面功能強大,但在數(shù)值計算和圖形繪制方面,V+并不具備太多優(yōu)勢。因此,采用ATLAB進展核心程序的開發(fā),用V+制作出友好的程序界面,然后將兩者結(jié)合起來,可以較大地進步編程效率。1.1ATLAB引擎方式ATLAB引擎采用客戶機/效勞器(lient/Server)的方式,提供了一組ATABAPI函數(shù),通過調(diào)用這些函數(shù)實現(xiàn)以用程序進程之間的數(shù)據(jù)傳遞。在運用中,讓V+程序作為前端客戶機,它向ATLAB引擎?zhèn)鬟f命令和數(shù)據(jù),并從ATLAB引擎承受數(shù)據(jù)信息,實現(xiàn)動態(tài)通訊。1.2ATLAB編譯器是ATLAB中經(jīng)過優(yōu)化的編譯器。使用,用戶可以將ATLAB數(shù)學庫、圖形庫和界面的A

3、TLAB程序轉(zhuǎn)化為獨立于ATLAB的EXE應用程序和DLL動態(tài)連接庫,在V中編寫程序界面并加載調(diào)用動態(tài)連接庫,實現(xiàn)兩者之間的連接。1.3組件組件對象模型簡稱R是以組件為發(fā)布單元的對象模型。它提供一種可以共享二進制代碼的工業(yè)標準,允許任何符合標準的程序訪問,所以作為不同語言之間的協(xié)作開發(fā)是非常方便的。ATLAB的編譯器是在ATLAB6.5中才開場提供的一個新工具,從ATLAB7.0起,這個產(chǎn)品改名為ATLABBuilderfr?;诘幕旌暇幊谭椒ㄒ彩莂thrks公司推薦使用的方法。以上三種方法中,采用ATLAB引擎方式,應用程序整體性能好,ATLAB引擎支持功能全面,但需要ATLAB后臺運行,不

4、能脫離ALAB環(huán)境。而方法和組件方法均可以脫離ATLAB環(huán)境,應用程序運行效率高,利于軟件的開發(fā),本文將重點闡述和組件方法。2.1ATLAB與V+接口配置采用方法需要對ATLAB和V+接口設置,配置步驟如下:1)ATLAB編譯器配置首先在ATLAB命令提示符下輸入build-setup命令,選擇編譯器,(需要注意的是必須確保計算機上已經(jīng)安裝了某個版本的V+,本文選擇visual+6.0)完成編譯器設置。2)V+環(huán)境設置(1)設定頭文件和庫文件途徑。在V+環(huán)境菜單欄中選擇Tls-ptins-Diretries,在“Shdiretriesfr欄中首先選擇Inludefiles,然后在“diretr

5、ies中將atlab7.0安裝目ExternLibin32irsftSV+60添加進去。再次在“Shdiretriesfr欄中選擇Librarysfiles,再在“diretries中添加atlab7.0安裝目錄ExternInlude。(2)設置編譯連接選項。在V+環(huán)境菜單欄中選擇Prjet-setting,然后選擇link選項卡,在bjet/librarydules欄中添加lrrt.liblibtest.lib;選擇General選項卡,在irsftFundatinlasses欄中選擇UseFinaSharedLibrary。2.2實例演示完成ATLAB和V+的接口設置以后,就可以實現(xiàn)AT

6、LAB和V+的接口編程,詳細步驟如下:1)編寫函數(shù)文件“ypasal.funtin=ypasal(n)=pasal(n);=;例如函數(shù)文件的作用是生成一個n階的帕斯卡矩陣并返回,Pasal矩陣特點:第一行和第一列的元素均為1,其他位置的元素是前方的元素和上方的元素之和。需要注意的是:由于ATLAB中矩陣存儲方式是以矩陣的列為先,也就是數(shù)據(jù)從第一列開場逐列存儲的,而/+中矩陣那么是以第一行開場逐漸存儲的,因此在函數(shù)的最后一行對返回矩陣取轉(zhuǎn)置運算,等效于使得計算得到的矩陣數(shù)據(jù)以行形式存儲。2)編譯文件在ATLAB命令行輸入-Bsharedlib:libtestypasal.-v命令(或-lib:l

7、ibtest-Tlink:libypasal.)將文件編譯成共享動態(tài)鏈接庫文件。命令執(zhí)行完畢后,在當前目錄中生成頭文件(libtest.h)、引入庫文件(libtest.lib)、tf(libtest.tf)文件、動態(tài)鏈接庫文件(libtest.dll)、源文件(libtest.)等8個文件。3)創(chuàng)立工程對話框運行visual+創(chuàng)立一個對話框工程,取名為test,承受所有默認的設置。去掉對話框上的靜態(tài)文本和按鈕,增加一個按鈕、一個靜態(tài)文本框、編輯框以及一個Listntrl,鼠標右鍵單擊Listntrl,選擇Prperties,把Vie改成Reprt,對話框界面如圖1所示。給Listntrl控件

8、添加listtrl類的對象_List,給編輯框關聯(lián)一個整型成員變量_size,給按鈕增加一個消息響應函數(shù)。圖14)添加編譯文件到工程將編譯生成的“l(fā)ibtest.h、“l(fā)ibtest.dll、“l(fā)ibtest.lib,“l(fā)ibtest.tf四個文件復制到工程目錄,將libtest.h參加工程,并在對話框程序文件“testDlg.pp中添加頭文件“l(fā)ibtest.h。5)V+中調(diào)用動態(tài)連接庫在nInitDialg()函數(shù)中添加初始化libtest.dll進程的碼:BLTestDlg:nInitDialg()Dialg:nInitDialg();/TD:Addextrainitializatinh

9、ereif(!lInitializeAppliatin(NULL,0)AfxessageBx(不能初始化程序!);exit(1);if(!libtestInitialize()AfxessageBx(不能初始化連接庫!);exit(1);returnTRUE;/returnTRUEunlessyusetthefustantrl在vidTestDlg:nreatebutt()函數(shù)中添加以下代碼,實現(xiàn)對ypasal.的調(diào)用,并將計算結(jié)果顯示在對話框界面中。vidTestDlg:nreatebutt()/TD:AddyurntrlntifiatinhandlerdehereUpdateData(TR

10、UE);dubledata;data=duble(_size);xArray*size;/輸入?yún)?shù)xArray*ut=NULL;/輸出參數(shù)/創(chuàng)立xArray數(shù)據(jù)對象,雙精度標量size=xreateDubleSalar(data);/內(nèi)存復制賦值epy(xGetPr(size),data,1*sizef(duble);lfypasal(1,ut,size);/函數(shù)調(diào)用/結(jié)果數(shù)據(jù)顯示Stringstrtext;inti,j;/去除已顯示的數(shù)據(jù)_List.DeleteAllItes();intnlun=_List.GetHeadertrl()-GetIteunt();fr(i=0;inlun;i+

11、)_List.Deletelun(0);/設置標題欄_List.Insertlun(0,);/附空值_List.Setlunidth(0,60);/設置每欄寬度fr(i=0;i_size;i+)strtext.Frat(lun%d,i+1);_List.Insertlun(i+1,strtext);_List.Setlunidth(i+1,60);/顯示結(jié)果數(shù)據(jù)fr(i=0;i_size;i+)strtext.Frat(R%d,i+1);_List.InsertIte(i+1,strtext);fr(j=0;j_size;j+)strtext.Frat(%.f,*(xGetPr(ut)+i*_

12、size+j);_List.SetIteText(i,j+1,strtext);xDestryArray(size);/數(shù)據(jù)內(nèi)存釋放xDestryArray(ut);利用lassizard為對話框添加nDestry()函數(shù),并添加以下代碼:vidTestDlg:nDestry()Dialg:nDestry();/TD:AddyuressagehandlerdeherlibtestTerinate();/終止進程lTerinateAppliatin();/終止R在V+中編譯、運行結(jié)果如圖2所示,與在ATLAB中運行文件的結(jié)果一樣。圖26)獨立應用程序的發(fā)布發(fā)布獨立的應用程序時,需要拷貝以下幾個文

13、件到目的機器上:RInstaller.exe,這個文件位于atlab7.0安裝目錄tl-bxpilerdeplyin32目錄之下,應用程序運行前要先點擊運行RInstaller.exe文件,按照提示步驟安裝好R,然后將工程文件的可執(zhí)行程序(.exe)、共享庫(.dll)以及其對應的tf文件復制到目的計算機即可獨立運行。3.1ATLAB里創(chuàng)立組件使用組件方法首先需要在ATLAB中創(chuàng)立組件,步驟如下:1)創(chuàng)立組件在ATLAB命令窗口輸入命令tl,翻開atlabBuilder對話框,它是atlabbuilderfr的主要工作環(huán)境。點擊File-NePrjet,會彈出一個新工程設置對話框,填入組件名和

14、類名,完成之后點K,完成新工程的創(chuàng)立。假如選擇的工程所在目錄并不存在,tl會提示該目錄不存在,并詢問是否創(chuàng)立該目錄,選擇Yes,tl就會創(chuàng)立工程到該目錄。2)添加文件到組件執(zhí)行完第一步后回到atlabbuilder界面。點擊剛剛創(chuàng)立的工程,單擊Addfiles按鈕,將文件添加到新建的組件類中。然后點擊Build-bjet編譯當前工程的組件,這個步驟不僅編譯了組件,同時也在計算機上注冊了該組件,它可以像其他組件一樣在V+中使用。編譯完成以后在用戶設置的工程目錄下將產(chǎn)生兩個子文件夾sr和distrib,sr里包含組件的源代碼,distrib里包含供用戶最終發(fā)布使用的組件。3)打包組件及R編譯完畢后

15、產(chǎn)生的組件只能在當前計算機上使用,為了可以把它發(fā)布到其他計算機上使用,還需要其他一些支持文件。另外,組件不同于普通的DLL文件,組件必須注冊后才能在計算機上使用。選擇pnent-pakagepnent命令,tl將會把發(fā)布該組件所需要的所有文件打包到一個和工程同名的可執(zhí)行文件中。這里可以選擇是否在打包文件中包含R。ATLAB7.0產(chǎn)生的組件必須運行在R環(huán)境。假如目的計算機上沒有安裝R,那么在打包組件的時候最好選擇包含R,這樣在打包文件中就會包含R的安裝文件。打包完成后將會在distrib中產(chǎn)生.exe的可執(zhí)行文件,這是一個可以自解壓的壓縮文件。其中包含4個文件:_install.bat,dll文

16、件,tf文件,RInstaller.exe。把產(chǎn)生的.exe文件復制到需要發(fā)布的計算機上運行。結(jié)果將會把這四個文件解壓,并執(zhí)行_install.bat,這是一個DS批處理文件,查看_install.bat的內(nèi)容后可以發(fā)現(xiàn)_install.bat將會運行RInstaller.exe來安裝R,并且在系統(tǒng)中注冊組件文件。3.2實例演示這里仍舊采用上例“ypasal.文件,按照3.1介紹的步驟創(chuàng)立組件,組件名取Tpasal,類名取Tpasallass。運行visual+創(chuàng)立一個與上例一樣對話框工程,對話框設置也與上例一樣。然后在F工程中進展如下操作:1)導入DLL文件將distrib文件夾里Tpasa

17、l_1_0.dll拷貝到工程文件夾,然后用V+命令#iprt來把Tpasal_1_0.dll導入工程中,#iprt命令的作用是從Tpasal_1_0.dll中導入組件中的接口類型定義,詳細做法是在stdafx.h里,參加下面兩行:#iprtTpasal_1_0.dllra_interfaes_nlyusingnaespaeTpasal;2)為工程對話框添加實現(xiàn)代碼在對話框按鈕消息響應函數(shù)中編寫調(diào)用組件代碼:vidTestDlg:nreatebuttn()/TD:AddyurntrlntifiatinhandlerdehereUpdateData(TRUE);Initialize(NULL);/

18、初始化/得到對象的LSIDLSIDlsid;HRESULThr;hr=LSIDFrPrgID(LESTR(Tpasal.Tpasallass.1_0),lsid);/創(chuàng)立一個對象的實例ITpasallass*pIpasal;hr=reatEinstane(lsid,NULL,LSTX_INPR_SERVER,_uuidf(ITpasallass),(LPVID*)pIpasal);if(FAILED(hr)/測試創(chuàng)立是否成功AfxessageBx(reatefailed);return;/初始化VARIANT變量VARIANTsize,ut;VariantInit(size);VariantI

19、nit(ut);/創(chuàng)立size,類型為VT_R8,即duble型size.vt=VT_R8;size.dblVal=(duble)_size;/創(chuàng)立二維數(shù)組ut,類型為VT_ARRAY,ARRAY中的元素為duble型ut.vt=VT_ARRAY|VT_R8;SAFEARRAYBUNDbund2;/設置第一維數(shù)組元素個數(shù)、元素索引下界bund0.Eleents=_size;bund0.lLbund=0;/設置第二維數(shù)組元素個數(shù)、元素索引下界bund1.Eleents=_size;bund1.lLbund=0;ut.parray=SafeArrayreate(VT_R8,2,bund);pIpasal-ypasal(1,ut,size);/函數(shù)調(diào)用/返回值傳遞duble*atrix,*pDest;atrix=neduble_size*_size;SafeArrayAessData(ut.parray,(vid*)pDest);/獲得數(shù)據(jù)指針,訪問數(shù)據(jù)epy(atrix,pDest,_size*_size*sizef(duble);/拷貝數(shù)據(jù)矩陣SafeArrayUnaessData(ut.parray);/釋放數(shù)據(jù)指針,取消訪問SafeArrayDestry

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論