MATLAB程式設(shè)計(jì)入門篇應(yīng)用程式介面.ppt_第1頁(yè)
MATLAB程式設(shè)計(jì)入門篇應(yīng)用程式介面.ppt_第2頁(yè)
MATLAB程式設(shè)計(jì)入門篇應(yīng)用程式介面.ppt_第3頁(yè)
MATLAB程式設(shè)計(jì)入門篇應(yīng)用程式介面.ppt_第4頁(yè)
MATLAB程式設(shè)計(jì)入門篇應(yīng)用程式介面.ppt_第5頁(yè)
已閱讀5頁(yè),還剩49頁(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、MATLAB 程式設(shè)計(jì)進(jìn)階篇應(yīng)用程式介面,張智星 .tw .tw/jang 清大資工系 多媒體檢索實(shí)驗(yàn)室,3-1 MATLAB應(yīng)用程式介面,應(yīng)用程式介面 Application Program Interface 簡(jiǎn)稱API 和外部程式或其它程式語(yǔ)言溝通,API 的功能,只要遵循 API 規(guī)範(fàn),可做到下列事項(xiàng): 從 MATLAB 呼叫 C 語(yǔ)言或 Fortran 語(yǔ)言撰寫的函數(shù) 將 MATLAB 當(dāng)成計(jì)算引擎(Computing Engine),並從獨(dú)立的 C 或 Fortran 程式呼叫此 MATLAB 引擎,進(jìn)行各種運(yùn)

2、算或圖形顯示 以獨(dú)立的C或Fortran程式讀寫MATLAB專用的MAT檔 在視窗環(huán)境,進(jìn)行ActiveX Automation,即將 MATLAB視為ActiveX Automation Server,讓其它應(yīng)用程式(Excel 或 Access等)呼叫,或?qū)ATLAB視為 ActiveX Automation Controller,呼叫視窗下其它應(yīng)用程式 在微軟視窗環(huán)境下,經(jīng)由 DDE(Dynamic Data Exchange)來(lái)和其它應(yīng)用程式溝通並傳送資料,3-2 撰寫能讓MATLAB呼叫的C 函數(shù):前置測(cè)試,撰寫C函數(shù)讓 MATLAB 呼叫的原因 MATLAB 程式碼執(zhí)行效率不佳,

3、希望以 C 程式碼改進(jìn)。常發(fā)生在MATLAB的 JIT 加速器無(wú)法加速您的程式碼,或是您的演算法無(wú)法改成向量化的程式碼。 隱藏程式碼,保護(hù)智慧財(cái)產(chǎn)權(quán)。C 的原始碼編譯後,變成二進(jìn)位碼, MATLAB 能夠呼叫,而使用者無(wú)法看到原始程式碼 不想將已寫好的 C 程式碼改寫成 MATLAB 程式碼,而希望在 MATLAB 的環(huán)境下呼叫這些 C 程式碼 進(jìn)行其它只有在 C 程式能做到的事,只能在 C 程式下完成的工作,更改呼叫端之工作空間的變數(shù) 產(chǎn)生常駐記憶體(Persistent Memory),即產(chǎn)生在函數(shù)結(jié)束後,仍能讓其它函數(shù)或 MATLAB 存取的資料結(jié)構(gòu)或變數(shù) 串接埠(Serial Port

4、)資料的傳送和接收 Device Drivers 等,提示,使用 pcode 指令 優(yōu)點(diǎn): 可將一般 M 檔案轉(zhuǎn)換成二進(jìn)制檔案 達(dá)到隱藏原始程式碼的功能 缺點(diǎn): 無(wú)法大幅提高程式碼的執(zhí)行效率,開(kāi)始前置測(cè)試 (I),選擇 C 編譯器編譯完成的 C 函數(shù) 在 MATLAB 指令視窗內(nèi)輸入 mex -setup,開(kāi)始前置測(cè)試 (II),選擇已安裝在電腦上的 C 編譯器,開(kāi)始前置測(cè)試 (III),按下 Enter 鍵,會(huì)出現(xiàn)畫面,提示,lcc 是Public-domain 的 C 程式編譯器 MATLAB 5.x,是隨 Stateflow Toolbox 而來(lái), MATLAB 6.x,是隨 MATLA

5、B 而來(lái)。 執(zhí)行mex -setup MATLAB 5.x 會(huì)跳出 DOS 視窗, MATLAB 6.x 不會(huì)跳出 DOS 視窗, 都在 MATLAB 命令視窗完成 其內(nèi)容則與 DOS 視窗的內(nèi)容大同小異,開(kāi)始前置測(cè)試 (IV),選用 微軟公司的 Visual C/C+,輸入1後,再按Enter鍵 最後,再按Enter鍵確認(rèn)即可,無(wú)安裝C編譯器,若 DOS 視窗無(wú)顯示可供選擇的 C 編譯器 電腦尚未安裝 C 編譯器 先安裝 C 編譯器才能進(jìn)行下一步的測(cè)試 例如:Microsoft Visual C/C+、Watcom C/C+、Borland C 等,開(kāi)始前置測(cè)試 (V),完成選擇 C 編譯器

6、的程序,可以測(cè)試 C 程式編譯 MATLAB 有一現(xiàn)成的 C 程式碼 yprime.c,其位置在 MATLAB rootexternexamplesmexyprime.c 測(cè)試之前,須將此檔案拷貝至目前目錄,才可進(jìn)行測(cè)試 cd D:matlabBookMATLAB程式設(shè)計(jì):進(jìn)階篇03-應(yīng)用程式介面 copyfile(matlabroot, externexamplesmexyprime.c) 若執(zhí)行 copyfile 指令時(shí)產(chǎn)生錯(cuò)誤訊息,通常表示目前目錄下已經(jīng)有 yprime.c 檔案,開(kāi)始前置測(cè)試 (VI),在 MATLAB 指令視窗,輸入下列敘述來(lái)編譯此 C 程式 mex yprime.c

7、 MATLAB 即呼叫 Visual C/C+(先前選的 C 編譯器)編譯 yprime.c,並產(chǎn)生編譯的訊息 若無(wú)錯(cuò)誤訊息,編譯完成後,C 編譯器會(huì)產(chǎn)生 yprime.dll 或 yprime.mexw32 可執(zhí)行檔 此即為 MATLAB 可呼叫的 C 函數(shù),所在的位置可顯示如下 which yprime D:matlabBookMATLAB程式設(shè)計(jì):進(jìn)階篇03-應(yīng)用程式介面yprime.mexw32,提示,在 MATLAB 7.1 之前,所產(chǎn)生的檔案是 yprime.dll,但從 MATLAB 7.1(含)之後,所產(chǎn)生的檔案是 yprime.mexw32。,開(kāi)始前置測(cè)試 (VII),測(cè)試y

8、prime執(zhí)行 yprime(1, 1:4) ans = 2.0000 8.9685 4.0000 -1.0947 MEX 檔案 MATLAB 可呼叫的可執(zhí)行檔通稱 在其它電腦平臺(tái)上,大部份以 mex 為此可執(zhí)行檔副檔名的一部份,整理:MEX檔案的副檔名,3-3 MATLAB的資料結(jié)構(gòu)及對(duì)應(yīng)API,MATLAB 變數(shù)的資料結(jié)構(gòu) MATLAB 內(nèi)部只有一種資料型態(tài) 宣告成 mxArray 是一個(gè) C 語(yǔ)言下的結(jié)構(gòu)(Structure),mxArray的Structure,MATLAB 對(duì)應(yīng)的變數(shù)名稱 維度 資料型態(tài) 實(shí)數(shù)或複數(shù) 是否為稀疏矩陣(Sparse Matrix),變數(shù)的實(shí)部和虛部,變數(shù)

9、的實(shí)部和虛部 在每個(gè) mxArray 結(jié)構(gòu),包含兩個(gè)指標(biāo)(Pointers) pr 及 pi 分別指到這個(gè)變數(shù)的實(shí)部和虛部 兩者都是資料型態(tài)為 double 的一維陣列 欲取得這兩個(gè)指標(biāo) 用 MATLAB 提供的 API 函數(shù) mxGetPr 及 mxGetPi 取得 可存取某個(gè) MATLAB 變數(shù)內(nèi)的所有數(shù)值,MATLAB 提供的API函數(shù) - mx,mx 為字頭的 API 函數(shù) MATLAB 變數(shù)資料(型態(tài)為 mxArray)的存取 mxGetPr(傳回實(shí)部指標(biāo)) mxGetPi(傳回虛部指標(biāo)) mxGetM(取得矩陣的橫列維度) mxGetN(取得矩陣的直行維度) mxCreateDou

10、bleMatrix(產(chǎn)生變數(shù)型態(tài)為 double 的矩陣),MATLAB 提供的API函數(shù) - mex,mex 為字頭的 API 函數(shù) MATLAB 環(huán)境下執(zhí)行的動(dòng)作 mexErrMsgTxt(在 MATLAB 印出錯(cuò)誤訊息,並跳出 MEX 檔案) mexCallMATLAB(呼叫 MATLAB 引擎以執(zhí)行 MATLAB 之?dāng)?shù)值運(yùn)算) mexPrintf(在 MATLAB 印出訊息),MATLAB 提供的API函數(shù) - mat,mat 為字頭的 API 函數(shù) 對(duì) MAT 檔案的讀寫或處理 matGetArray(從 MAT 檔案讀取 mxArray 陣列) matDeleteArray(從 M

11、AT 檔案移除 mxArray 陣列),3-4一個(gè)最簡(jiǎn)單的 MEX 檔案,將一個(gè)輸入純量(資料型態(tài)為 double)乘以 2 此程式碼已內(nèi)建在 MATLAB 光碟中 MATLAB rootexternexamplesrefbooktimestwo.c 範(fàn)例3-1:scalarx2.c 有timestwo.c詳細(xì)的中文註解,並改名為 scalarx2.c,簡(jiǎn)單MEX檔案範(fàn)例 (I),在 MATLAB 中,呼叫 C 編譯器對(duì) scalarx2.c 進(jìn)行編譯 mex scalarx2.c 編譯完後,確認(rèn)可執(zhí)行檔是否存在 which scalarx2 D:matlabBookMATLAB程式設(shè)計(jì):進(jìn)階

12、篇03-應(yīng)用程式介面scalarx2.dll,簡(jiǎn)單MEX檔案範(fàn)例 (II),進(jìn)行各項(xiàng)測(cè)試 scalarx2(8.5) ans = 17 scalarx2(String input) ? Input must be a scalar. scalarx2(1 2 3) ? Input must be a scalar.,MEX檔案的說(shuō)明 (I),同時(shí)有 scalarx2.m 及scalarx2.mexw32 存在於同一目錄下 MATLAB 選用 scalarx2.mexw32 檔來(lái)執(zhí)行 若輸入help scalarx2 MATLAB會(huì)列出 scalarx2.m 的線上輔助說(shuō)明 有關(guān) scalarx

13、2.mexw32 的線上輔助說(shuō)明,就必須置於 scalarx2.m 之內(nèi),MEX檔案的說(shuō)明 (II), type scalarx2.m function out = scalarx2(in) % SCALARX2 A scalar version of times two. %This serves as an example of putting on-line help in an %M-file, but the actual program body is in another MEX-file %with the same major file name. help scalarx2

14、 SCALARX2 A scalar version of times two. This serves as an example of putting on-line help in an M-file, but the actual program body is in another MEX-file with the same major file name. which scalarx2 D:matlabBookMATLAB程式設(shè)計(jì):進(jìn)階篇03-應(yīng)用程式介面scalarx2.mexw32,3-5 處理二維矩陣的 MEX 檔案範(fàn)例,將輸入二維矩陣(可能包含實(shí)部和虛部)乘以2 範(fàn)例3-

15、2:arrayx2.c 編譯程式 mex arrayx2.c 確認(rèn)可執(zhí)行檔的存在 which arrayx2 D:matlabBookMATLAB程式設(shè)計(jì):進(jìn)階篇03-應(yīng)用程式介面yprime.mexw32,二維矩陣範(fàn)例-1,進(jìn)行測(cè)試 arrayx2(1 2 3) ans = 2 4 6 arrayx2(1+i 2+2i 3+3i; 4 5 6) ans = 2.0000 + 2.0000i 4.0000 + 4.0000i 6.0000 + 6.0000i 8.0000 10.0000 12.0000 arrayx2(Test string) ? Input must be a double

16、.,二維矩陣範(fàn)例-2 (I),兩個(gè)輸入矩陣 A 和 B 矩陣旳大小分別是 pm 及 pn 分別代表由 m 個(gè)直行向量及 n 個(gè)直行向量所形成的集合每一個(gè)向量的長(zhǎng)度都是 p 傳回一個(gè)距離矩陣 C C(i, j)為向量 A(:, i) 和向量 B(:, j) 的矩離,提示,大量資料的處理 一般的慣例都是將各個(gè)向量以直行向量的方式堆成一個(gè)矩陣,再進(jìn)行各種處理,二維矩陣範(fàn)例-2 (II),範(fàn)例3-3:pairdist.c 編譯程式 mex pairdist.c,二維矩陣範(fàn)例-2 (III),測(cè)試程式 which pairdist D:matlabBookMATLAB程式設(shè)計(jì):進(jìn)階篇03-應(yīng)用程式介面p

17、airdist.dll pairdist(2 3, 2 3 4) ans = 0 1 2 1 0 1,二維矩陣範(fàn)例-2 (IV), A = rand(2, 3); B = rand(2, 4); C = pairdist(A, B) C = 0.5104 0.9806 0.4544 0.5649 0.3562 0.2347 0.5911 0.2628 0.2101 0.5891 0.2675 0.1639 pairdist(string1, string2) ? Input 1 is not a full numerical array!,3-6 產(chǎn)生基本工作空間變數(shù)的 MEX 檔案範(fàn)例,將輸

18、入矩陣乘以 2 之後,存放成 MATLAB 基本工作空間中的一個(gè)變數(shù) 範(fàn)例3-4:putarray.c 測(cè)試程式 clear all mex putarray.c putarray(1 2 5) putarray_output is created in the base workspace. whos Name Size Bytes Class putarray_output 1x3 24 double array Grand total is 3 elements using 24 bytes,檢視變數(shù),putarray_output由putarray所置放在 MATLAB基本工作空間的變

19、數(shù),可以檢視 putarray_output putarray_output = 2 4 10 這個(gè)範(fàn)例可能的應(yīng)用 從 RS232 埠讀取 GPS 傳回的資料,將資料進(jìn)行處理後送入MATLAB 的基本工作空間,MATLAB 再根據(jù)此工作空間的變數(shù)進(jìn)行即時(shí)的圖形繪製或成像 從影像擷取卡抓取影像資像,送入 MATLAB 的基本工作空間,MATLAB 再根據(jù)此資料進(jìn)行即時(shí)計(jì)算,例如人臉辨識(shí)或指紋辨識(shí)等,3-7 對(duì)於結(jié)構(gòu)陣列的處理,MATLAB 也提供比較複雜的資料結(jié)構(gòu),例如結(jié)構(gòu)陣列、異質(zhì)陣列等 可以撰寫C程式碼,來(lái)和MATLAB內(nèi)部的結(jié)構(gòu)陣列進(jìn)行資料的交換和計(jì)算。 範(fàn)例3-5:matlabStruc

20、t2c.c,結(jié)構(gòu)陣列範(fàn)例1 (I),測(cè)試程式 範(fàn)例3-5:matlabStruct2c01.m,mex matlabStruct2c.c x(1).name = 林政源; x(1).phone = 2796; x(2).name = 陳江村; x(2).phone = 3425; x(3).name = 張永森; x(3).phone = 3213; matlabStruct2c(x),結(jié)構(gòu)陣列範(fàn)例1 (II),結(jié)果 = 林政源 friend0.phone = 2796.000000 = 陳江村 friend1.phone = 3425.00

21、0000 = 張永森 friend2.phone = 3213.000000 由 MATLAB 印出來(lái)的訊息,事實(shí)上已經(jīng)是 C 程式碼的結(jié)構(gòu)陣列的欄位值。,結(jié)構(gòu)陣列範(fàn)例2,將 C 的結(jié)構(gòu)陣列,送到 MATLAB 工作空間的結(jié)構(gòu)陣列 範(fàn)例3-7:cStruct2matlab.c 測(cè)試程式 範(fàn)例3-8:cStruct2matlab01.m 1x3 struct array with fields: name phone MATLAB 在工作空間的結(jié)構(gòu)陣列 x 即是由 C 的結(jié)構(gòu)陣列轉(zhuǎn)換出來(lái)的結(jié)果。,mex cStruct2matlab.c x = cStruct2matl

22、ab,3-8從獨(dú)立的 C 程式來(lái)呼叫MATLAB 引擎,可由獨(dú)立的 C 程式呼叫 MATLAB 引擎 已有一C 程式碼,但想要使用 MATLAB 的特殊功能完成某些特定的工作 Ex: 使用 MATLAB 的數(shù)學(xué)功能,例如計(jì)算反矩陣、行列式、最小平方解、奇異值分解(Singlar Value Decomposition)等 使用 MATLAB 的圖形顯示功能,例如二維及三維圖形、動(dòng)畫等,提示,欲將獨(dú)立的 MATLAB 視窗應(yīng)用程式轉(zhuǎn)換成單獨(dú)的可執(zhí)行檔 Standalone Executable 不需安裝MATLAB就可運(yùn)作的 .exe 檔案 需MATLAB 5.x 和 6.x 的Runtime

23、Server工具箱 將 MATLAB 視窗應(yīng)用程式轉(zhuǎn)成 .exe 檔案,包含所有的圖形顯示功能 讓沒(méi)有安裝 MATLAB 的人使用 MATLAB 7.x,Runtime Server工具箱已不存在,功能已搬到MATLAB Compiler工具箱,C 呼叫 MATLAB 範(fàn)例 (I),C 程式碼裡面啟動(dòng) MATLAB 並執(zhí)行一個(gè) M 檔案 plotSine.m,同時(shí)秀出執(zhí)行 whos 指令後的訊息,C 的範(fàn)例程式碼是 plotViaMatlab01.c。 在 MATLAB 輸入命令編譯此 C 程式碼 範(fàn)例3-9:matlabEngine01.m,optsFile = matlabroot bin

24、win32mexoptsmsvc60engmatopts.bat; mex(-f, optsFile, plotViaMatlab01.c);% 進(jìn)行編譯 !plotViaMatlab01% 測(cè)試程式,C 呼叫 MATLAB 範(fàn)例 (II),若一切無(wú)誤,將產(chǎn)生plotViaMatlab01.exe 執(zhí)行此程式碼後 啟動(dòng)另一個(gè) MATLAB 執(zhí)行 plotSine.m 畫出右列圖形,C 呼叫 MATLAB 範(fàn)例 (III),同時(shí)跳出一個(gè)訊息視窗,以顯示 MATLAB 在執(zhí)行 whos 指令後 的輸出訊息 同時(shí)工作列也會(huì)顯示一個(gè) MATLAB 的圖示,代表 MATLAB engine 正在執(zhí)行中。

25、當(dāng)你按下訊息視窗的確定後,MATLAB engine 也就跟著結(jié)束。,C 呼叫 MATLAB 的重點(diǎn) (I),首先產(chǎn)生一 MATLAB Engine的物件,經(jīng)由這個(gè)物件啟動(dòng) MATLAB 及和 MATLAB 溝通,經(jīng)由下列程式碼完成 Engine *ep=engOpen(NULL);,C 呼叫 MATLAB 的重點(diǎn) (II),再來(lái)假設(shè)欲呼叫的MATLAB程式plotSine.m 與呼叫的C程式在同一目錄,將 MATLAB 切換到此目錄 將此程式所在目錄存入字串 buffer:_getcwd(buffer, BUFSIZE ); 產(chǎn)生 MATLAB 內(nèi)部字串變數(shù) app:app = mxCrea

26、teString(buffer); 將字串變數(shù) app 置入工作空間變數(shù) appDir:engPutVariable(ep, appDir, app); 將 MATLAB 的工作目錄切換至字串 appDir 所指定的目錄 engEvalString(ep, cd(appDir);,C 呼叫 MATLAB 的重點(diǎn) (III),最後就將我們想要呼叫的 MATLAB 程式 plotSine.m 傳入執(zhí)行,即可大功告成:engEvalString(ep, plotSine);,C 呼叫 MATLAB 的重點(diǎn) (IV),接著我們要顯示 MATLAB 在執(zhí)行 whos 之後所得到的輸出訊息 設(shè)定 buff

27、er 可以接收 MATLAB 的輸出訊息: engOutputBuffer(ep, buffer, BUFSIZE); 在 MATLAB engine 執(zhí)行 whos 指令: engEvalString(ep, whos); 顯示 buffer 的內(nèi)容: MessageBox (HWND)NULL, (LPSTR)buffer, (LPSTR) MATLAB - whos, MB_OK); 最後關(guān)閉 MATLAB engine: engClose(ep);,如果發(fā)生編譯錯(cuò)誤,可能是你所使用的編譯器不是 MSVC6.0,此時(shí)要將編譯參數(shù)檔 optsFile 改成適合你所用的編譯器,常用的編譯參數(shù)檔案可以顯示如下: 範(fàn)例3-11:showOptsFile.m bcc53engmatopts.bat df50engmatopts.bat msvc70engmat

溫馨提示

  • 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)論