MATLAB外部接口編程(張威) 第6章.ppt_第1頁(yè)
MATLAB外部接口編程(張威) 第6章.ppt_第2頁(yè)
MATLAB外部接口編程(張威) 第6章.ppt_第3頁(yè)
MATLAB外部接口編程(張威) 第6章.ppt_第4頁(yè)
MATLAB外部接口編程(張威) 第6章.ppt_第5頁(yè)
已閱讀5頁(yè),還剩85頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、第6章 MATLAB計(jì)算引擎應(yīng)用,6.1 概述 6.2 計(jì)算引擎應(yīng)用 6.3 編譯應(yīng)用程序 6.4 計(jì)算引擎應(yīng)用示例 練習(xí),6.1 概 述,MATLAB的計(jì)算引擎應(yīng)用實(shí)際上就是利用MATLAB提供的一組接口函數(shù)(API),在用戶開(kāi)發(fā)的C語(yǔ)言或者Fortran語(yǔ)言應(yīng)用程序中,通過(guò)某種通信機(jī)制后臺(tái)調(diào)用MATLAB應(yīng)用程序以完成復(fù)雜的系統(tǒng)任務(wù)。計(jì)算引擎應(yīng)用程序是在MATLAB環(huán)境之外的可執(zhí)行應(yīng)用程序,在它們運(yùn)行的過(guò)程中需要利用某種通信機(jī)制和另外一個(gè)MATLAB進(jìn)程(會(huì)話)交互數(shù)據(jù)。在不同系統(tǒng)平臺(tái)上,應(yīng)用程序使用的通信機(jī)制是不一樣的,例如在UNIX系統(tǒng)中使用管道(pipes)完成,而在Windows平

2、臺(tái)中,這種通信機(jī)制是利用COM應(yīng)用接口IEngine來(lái)完成的, 圖6-1表示了計(jì)算引擎應(yīng)用在Windows系統(tǒng)中的情況。,圖6-1 Windows平臺(tái)上的計(jì)算引擎應(yīng)用程序,在Windows平臺(tái)上,用戶開(kāi)發(fā)的C語(yǔ)言或者Fortran語(yǔ)言應(yīng)用程序作為COM應(yīng)用的客戶端,是整個(gè)應(yīng)用程序的前端,而MATLAB作為COM應(yīng)用的服務(wù)器運(yùn)行在后臺(tái)。兩者利用MATLAB提供的計(jì)算引擎接口函數(shù)進(jìn)行交互,例如在客戶端從MATLAB進(jìn)程中獲取數(shù)據(jù),或者在客戶端調(diào)用MATLAB的指令等。 在C語(yǔ)言或者Fortan語(yǔ)言中使用MATLAB計(jì)算引擎應(yīng)用集成MATLAB的算法與其它的集成方法比較,計(jì)算引擎應(yīng)用程序具有如下幾點(diǎn)

3、優(yōu)勢(shì):, 調(diào)用MATLAB數(shù)學(xué)函數(shù)完成繁重的數(shù)學(xué)計(jì)算,充分發(fā)揮MATLAB在數(shù)值計(jì)算上的強(qiáng)大優(yōu)勢(shì),通過(guò)C語(yǔ)言或者Fortran語(yǔ)言編寫(xiě)的GUI來(lái)調(diào)用后臺(tái)的MATLAB數(shù)學(xué)計(jì)算功能,完成特殊的需要,節(jié)約開(kāi)發(fā)時(shí)間。 在UNIX平臺(tái)上,計(jì)算引擎的MATLAB進(jìn)程不僅可以運(yùn)行在本地計(jì)算機(jī)上,也可以運(yùn)行在網(wǎng)絡(luò)中的任何一臺(tái)計(jì)算機(jī)上,這樣可以將本地計(jì)算機(jī)作為前端的用戶接口界面來(lái)直接調(diào)用后臺(tái)復(fù)雜的算法。, 避免將龐大的MATLAB函數(shù)庫(kù)鏈接到客戶應(yīng)用程序中。利用MATLAB Compiler打包的函數(shù)庫(kù)時(shí),需要將MATLAB的數(shù)學(xué)庫(kù)或者圖形庫(kù)都鏈接到客戶應(yīng)用程序中,這樣的操作會(huì)使客戶應(yīng)用程序變得龐大,而MAT

4、LAB計(jì)算引擎函數(shù)庫(kù)僅僅采用十幾個(gè)函數(shù)就可以完成這些復(fù)雜的操作了。 不是所有的MATLAB函數(shù)都可以使用MATLAB Complier或者COM Builder打包成為函數(shù)庫(kù)或者COM組件,而使用MATLAB計(jì)算引擎則沒(méi)有此類限制。,6.2 計(jì)算引擎應(yīng)用,6.2.1 簡(jiǎn)單計(jì)算引擎應(yīng)用示例 下面看一個(gè)簡(jiǎn)單的MATLAB計(jì)算引擎應(yīng)用的例子,這個(gè)例子使用C語(yǔ)言開(kāi)發(fā)。通過(guò)本例子來(lái)了解一下MATLAB計(jì)算引擎應(yīng)用程序的基本結(jié)構(gòu)和編譯方法。 !simpleengdemo 該函數(shù)在Fortran語(yǔ)言中的定義如下: integer*4 function engOpen(startcmd) integer*4

5、ep character*(*) startcmd,該函數(shù)具有一個(gè)輸入?yún)?shù)字符串,在UNIX平臺(tái)上,如果輸入?yún)?shù)是空字符串或者NULL,則計(jì)算引擎打開(kāi)本地計(jì)算機(jī)的MATLAB作為計(jì)算引擎的后臺(tái)服務(wù);如果輸入?yún)?shù)是遠(yuǎn)程的計(jì)算機(jī)名稱(hostname),則將相應(yīng)的計(jì)算機(jī)上的MATLAB啟動(dòng)作為計(jì)算引擎的后臺(tái)服務(wù)。 在Windows平臺(tái)上,該輸入?yún)?shù)只能為NULL。如果engOpen函數(shù)成功運(yùn)行,則一個(gè)MATLAB進(jìn)程作為后臺(tái)服務(wù)啟動(dòng),并且返回計(jì)算引擎的指針。,2. 關(guān)閉計(jì)算引擎engClose 關(guān)閉計(jì)算引擎的函數(shù)為engClose,該函數(shù)在C語(yǔ)言中的定義如下: int engClose(Engin

6、e *ep); 該函數(shù)在Fortran語(yǔ)言中的定義如下: integer*4 function engClose(ep) integer*4 ep 該函數(shù)只有一個(gè)輸入?yún)?shù)MATLAB計(jì)算引擎指針,如果成功關(guān)閉了計(jì)算引擎,則作為計(jì)算引擎的MATLAB后臺(tái)服務(wù)進(jìn)程被關(guān)閉,然后返回整數(shù)0表示成功完成了操作。,3. 執(zhí)行MATLAB指令engEvalString 在MATLAB計(jì)算引擎應(yīng)用程序中運(yùn)行MATLAB指令的函數(shù)是engEvalString,該函數(shù)在C語(yǔ)言中的定義如下: int engEvalString(Engine *ep, const char *string); 該函數(shù)在Fortran

7、語(yǔ)言中的定義如下: integer*4 function engEvalString(ep, command) integer*4 ep character*(*) command,該函數(shù)具有兩個(gè)輸入?yún)?shù),分別為計(jì)算引擎的指針ep和需要執(zhí)行的MATLAB指令command。如果該函數(shù)返回了數(shù)值0,則表明計(jì)算引擎已經(jīng)成功處理了用戶的指令。注意,在調(diào)用該函數(shù)時(shí),請(qǐng)盡量保證參數(shù)command包含的MATLAB指令是合法的。,4. 獲取數(shù)據(jù)engGetVariable 獲取數(shù)據(jù)的函數(shù)是engGetVariable,它能夠從當(dāng)前作為計(jì)算引擎服務(wù)的MATLAB會(huì)話中獲取指定的變量,它在C語(yǔ)言中的定義如下:

8、 mxArray *engGetVariable(Engine *ep, const char *name);,該函數(shù)在Fortran語(yǔ)言中的定義如下: integer*4 function engGetVariable(ep, name) integer*4 ep character*(*) name 該函數(shù)的輸入?yún)?shù)分別為MATLAB計(jì)算引擎的指針ep和需要讀取的變量名name,如果成功讀取了數(shù)據(jù),則函數(shù)返回mxArray數(shù)據(jù)類型對(duì)象指針。,5. 寫(xiě)入數(shù)據(jù)engPutVariable 從計(jì)算引擎應(yīng)用程序向MATLAB會(huì)話寫(xiě)入數(shù)據(jù)的函數(shù)是engPutVariable,該函數(shù)在C語(yǔ)言中的定義如

9、下: int engPutVariable(Engine *ep, const char *name, const mxArray *mp);,該函數(shù)在Fortran語(yǔ)言中的定義如下: integer*4 function engPutVariable(ep, name ,mp) integer*4 ep, mp character*(*) name 該函數(shù)具有三個(gè)輸入?yún)?shù),分別為計(jì)算引擎指針ep、變量的名稱name和在C語(yǔ)言或者Fortran源中創(chuàng)建mxArray數(shù)據(jù)類型對(duì)象的指針mp。如果函數(shù)成功寫(xiě)入了數(shù)據(jù),則返回整數(shù)數(shù)值0。,6.3 編譯應(yīng)用程序,6.3.1 命令行編譯 在生成可執(zhí)行應(yīng)用

10、程序時(shí),可以通過(guò)命令行完成程序的編譯,也就是說(shuō),可以在MATLAB的命令行窗口下或者操作系統(tǒng)的控制臺(tái)方式下,通過(guò)MEX指令完成應(yīng)用程序的編譯。在前面的章節(jié)介紹了MEX指令,讀者應(yīng)該知道MEX指令是通過(guò)選項(xiàng)文件完成程序的編譯工作的,在編譯MEX文件時(shí),需要針對(duì)不同的編譯器選擇不同的選項(xiàng)文件,MAT數(shù)據(jù)文件應(yīng)用程序是這樣,MATLAB計(jì)算引擎應(yīng)用程序也是如此。,和生成MEX文件不同,生成MEX文件時(shí),只要在MATLAB中完成編譯器的配置工作就可以直接使用MEX指令完成MEX文件的編譯工作。因?yàn)榕渲镁幾g器的時(shí)候,需要將編譯器的選項(xiàng)文件改名為mexopts.bat選項(xiàng)文件,并且拷貝到了系統(tǒng)環(huán)境目錄下。

11、不過(guò)在系統(tǒng)路徑下mexopts.bat文件不能完成MATLAB計(jì)算引擎應(yīng)用程序的編譯,必須通過(guò)MEX命令行,指定具體的選項(xiàng)文件才可以。為了便于說(shuō)明編譯過(guò)程,這里使用一個(gè)Fortran語(yǔ)言的計(jì)算引擎應(yīng)用程序作為示例。, mex -f %MATLABROOT%binwin32mexoptsdf60engmatopts.bat fengdemo.f,其中,%MATLABROOT%是程序員使用的MATLAB的安裝路徑。如果fengdemo.f程序中沒(méi)有任何錯(cuò)誤,則MEX指令將成功地將fengdemo.f源代碼編譯生成為可執(zhí)行的應(yīng)用程序。如果存在任何錯(cuò)誤或者警告提示,請(qǐng)讀者對(duì)照例子的源代碼,仔細(xì)修改直到

12、編譯通過(guò)為止。接著,就可以運(yùn)行得到的可執(zhí)行應(yīng)用程序。,在MATLAB命令行窗口中鍵入如下命令: dir *.exe fengdemo.exe !fengdemo 025 mxArray *equation; 026 char flag1,bufferBUFFERLEN; 027 int status; 028 029 /* 打開(kāi)計(jì)算引擎 */ 030 ep = engOpen( NULL ); 031 if( ep = (Engine *)NULL ) 032 fprintf( stderr, 錯(cuò)誤:無(wú)法打開(kāi)MATLAB!n ); 033 fprintf(stdout,計(jì)算引擎MATLAB是可

13、見(jiàn)的.n);,034 fprintf(stdout,隱藏它!n按任意鍵繼續(xù).n); 035 getch(); 036 /* 隱藏計(jì)算引擎的窗口 */ 037 status = engSetVisible(ep,false); 038 if(status != 0) 039 040 fprintf( stderr, 錯(cuò)誤:無(wú)法隱藏計(jì)算窗口.n ); 041 return( NULL ); 042 043 fprintf(stdout,進(jìn)行數(shù)據(jù)處理計(jì)算.); 044 /* 將數(shù)據(jù)傳輸?shù)組ATLAB工作空間*/,045 status = engPutVariable( ep, x, x ); 046

14、 if( status != 0 ) 047 048 fprintf( stderr, 錯(cuò)誤:無(wú)法將數(shù)據(jù)傳輸?shù)組ATLAB工作空間.n ); 049 return( NULL ); 050 051 status = engPutVariable( ep, y, y ); 052 if( status != 0 ) 053 054 fprintf( stderr, 錯(cuò)誤:無(wú)法將數(shù)據(jù)傳輸?shù)組ATLAB工作空間.n ); 055 return( NULL );,056 057 /* 設(shè)置輸出緩存區(qū) */ 058 engOutputBuffer( ep, buffer, BUFFERLEN ); 05

15、9 /* 執(zhí)行多項(xiàng)式擬合 */ 060 status = engEvalString( ep, k5=polyfit(x,y,5);y5=polyval(k5,x);); 061 if( status != 0 ) 062 063 /* 進(jìn)行錯(cuò)誤檢測(cè).*/ 064 fprintf( stderr, 錯(cuò)誤:無(wú)法運(yùn)行MATLAB命令.n ); 065 fprintf( stderr, %sn, buffer ); 066 return( NULL ); 067 ,068 engEvalString(ep,subplot(2,1,1);plot(x,y,b,x,y5,r);); 069 engEva

16、lString(ep,xlabel(x); ylabel(y);title(x Vs y);axis tight;); 070 engEvalString(ep,legend(Original,Fitted);); 071 engEvalString(ep,subplot(2,1,2);bar(x,y-y5,r);xlabel(x);ylabel(y-y5);); 072 engEvalString(ep,title(Residuals);axis tight;); 073 /* 獲取計(jì)算的結(jié)果 */ 074 equation = engGetVariable( ep, k5 );,075 f

17、printf(stdout,Done!n); 076 fprintf(stdout,按任意鍵繼續(xù).n); 077 getch(); 078 /* 關(guān)閉計(jì)算引擎 */ 079 status = engClose( ep ); 080 if( status != 0 ) 081 082 fprintf( stderr, 錯(cuò)誤:無(wú)法關(guān)閉MATLAB計(jì)算引擎.n ); 083 084 return( equation ); 085 086 /* 主函數(shù) */,087 void main() 088 089 mxArray *xdata, *ydata, *eqn; 090 char matfile =

18、 curvedata.mat; 091 /* 從數(shù)據(jù)文件curvedata.mat中獲取變量x 100 ,例6-3的代碼中使用了兩個(gè)比較特別的eng函數(shù):在第037行的代碼中,使用了engSetVisible函數(shù),該函數(shù)只能夠用于C語(yǔ)言計(jì)算引擎應(yīng)用程序中,它的功能是使當(dāng)前的MATLAB計(jì)算引擎窗口成為不可見(jiàn),也就是隱藏起來(lái)。該函數(shù)的定義如下: int engSetVisible(Engine *ep, bool value);,該函數(shù)的第一個(gè)參數(shù)是MATLAB計(jì)算引擎的指針ep,第二個(gè)參數(shù)是一個(gè)布爾類型的數(shù)據(jù)value,如果該數(shù)據(jù)為邏輯真時(shí),則MATLAB的窗口為可見(jiàn)的狀態(tài),也就是顯示在計(jì)算機(jī)

19、平臺(tái)上。如果該數(shù)據(jù)為邏輯假時(shí),則MATLAB的窗口為不可見(jiàn)的狀態(tài),也就是隱藏起來(lái)。所以當(dāng)例6-3運(yùn)行到037行時(shí),MATLAB計(jì)算引擎窗口就隱藏起來(lái)了。如果函數(shù)成功運(yùn)行,則函數(shù)返回值為整數(shù)0。 如果需要判斷當(dāng)前的MATLAB計(jì)算引擎窗口是否可見(jiàn),可以使用engGetVisible函數(shù),該函數(shù)的定義如下: int engGetVisible(Engine *ep, bool *value);,該函數(shù)的參數(shù)和engSetVisible的參數(shù)類似,不同的是第二個(gè)輸入?yún)?shù)為布爾類型變量指針,當(dāng)MATLAB計(jì)算引擎窗口不可見(jiàn)時(shí),該數(shù)值為邏輯假,否則為邏輯真。 在例6-3代碼的058行調(diào)用了函數(shù)engOutputBuffer ,該函數(shù)的作用是定義一個(gè)字符串緩沖區(qū),該緩沖區(qū)將獲取engEvalString函數(shù)在運(yùn)行MATLAB指令過(guò)程中,MATLAB指令本應(yīng)該輸出到MATLAB窗口中的文本信息。該函數(shù)在C語(yǔ)言中的定義如下: int engOutputBuffer(Engine *ep, char *p, int n);,該函數(shù)中有三個(gè)參

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論