MATLAB基礎(chǔ)與實例進階-08_第1頁
MATLAB基礎(chǔ)與實例進階-08_第2頁
MATLAB基礎(chǔ)與實例進階-08_第3頁
MATLAB基礎(chǔ)與實例進階-08_第4頁
MATLAB基礎(chǔ)與實例進階-08_第5頁
已閱讀5頁,還剩129頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

2023/2/4機械工業(yè)出版社Page1第8章MATLAB與C/C++混合編程【學(xué)習目標】了解MATLAB的外部編程接口熟悉MATLAB與C/C++的混合編程方法掌握使用MAT文件按實現(xiàn)數(shù)據(jù)交互掌握使用共享庫實現(xiàn)混合編程掌握使用MEX文件實現(xiàn)混合編程掌握使用MATLAB引擎實現(xiàn)混合編程掌握使用編譯器實現(xiàn)混合編程2023/2/4機械工業(yè)出版社Page2第8章MATLAB與C/C++混合編程MATLAB混合編程該韓素8.1使用MAT文件實現(xiàn)數(shù)據(jù)交互8.2使用共享庫實現(xiàn)混合編程8.3使用MEX文件實現(xiàn)混合編程8.4使用MATLAB編譯器實現(xiàn)混合編程8.6使用MATLAB引擎實現(xiàn)混合編程8.52023/2/4機械工業(yè)出版社Page38.1MATLAB混合編程概述8.1.1MATLAB外部接口簡介8.1.2常用MATLAB與C/C++混合編程方法2023/2/4機械工業(yè)出版社Page4MATLAB應(yīng)用程序接口是MATLAB與外部程序和數(shù)據(jù)進行交互的通道,通過MATLAB應(yīng)用程序接口,可以實現(xiàn)MATLAB與其它高級編程語言的混合編程。8.1.1MATLAB外部接口簡介2023/2/4機械工業(yè)出版社Page5MATLAB提供的外部接口包括:數(shù)據(jù)共享接口、外部程序接口、COM客戶端和服務(wù)器自動化接口以及外設(shè)數(shù)據(jù)交換接口。另外,MATLAB還為用戶提供了MATLAB編譯器,可進一步發(fā)揮MATLAB的計算與圖形操作威力。8.1.1MATLAB外部接口簡介2023/2/4機械工業(yè)出版社Page6MATLAB數(shù)據(jù)交互接口MATLAB通過MAT文件與其它編程平臺實現(xiàn)數(shù)據(jù)交互。MAT文件是MATLAB數(shù)據(jù)存儲默認的文件格式,其文件名以.mat為后綴。MATLAB為用戶提供了一系列操作MAT文件的API函數(shù),可以利用這些函數(shù)實現(xiàn)對MAT文件的訪問。8.1.1MATLAB外部接口簡介2023/2/4機械工業(yè)出版社Page7MATLAB共享庫接口共享庫是一組可以在程序運行時動態(tài)加載的函數(shù)的集合,不同平臺下的共享庫有不同的形式;Windows的共享庫是指動態(tài)連接庫,后綴為.dll,UNIX和Linux下的共享庫是指共享對象文件,后綴為.so。MATLAB提供在MATLAB中調(diào)用共享庫的接口函數(shù),可以實現(xiàn)共享庫的加載、釋放、參數(shù)傳遞和函數(shù)調(diào)用等操作。8.1.1MATLAB外部接口簡介2023/2/4機械工業(yè)出版社Page8MATLAB外部程序接口MATLAB通過MEX文件實現(xiàn)與外部程序的連接。MEX是MATLABExecutable的縮寫,即MATLAB可執(zhí)行程序。MEX文件是MATLAB調(diào)用其它編程語言編寫的程序或算法的接口,符合MATLAB的調(diào)用格式,可以被MATLAB解釋器載入執(zhí)行。8.1.1MATLAB外部接口簡介2023/2/4機械工業(yè)出版社Page9MATLAB引擎MATLAB引擎是一組允許用戶在其它應(yīng)用程序中與MATLAB交互的函數(shù)接口庫。通過這些接口函數(shù),用戶可以在C、C++和Fortran等高級編程語言中實現(xiàn)對MATLAB的控制,將MATLAB作為一種計算引擎使用。8.1.1MATLAB外部接口簡介2023/2/4機械工業(yè)出版社Page10MATLAB編譯器MATLAB編譯器是MATLAB環(huán)境下的編譯工具,它能將M文件轉(zhuǎn)換為C或C++等不同類型的源代碼、MEX文件、可獨立運行的應(yīng)用程序文件或組件。MATLAB還為Java、.NET和Excel提供了單獨的Builder,可以實現(xiàn)M文件到Java類、.NET組件和Exceladd-ins的轉(zhuǎn)換。8.1.1MATLAB外部接口簡介2023/2/4機械工業(yè)出版社Page11MATLAB的Java接口MATLAB的Java接口是在MATLAB環(huán)境中運行和使用Java程序所提供的函數(shù)庫。通過MATLAB接口,用戶可以在MATLAB中直接訪問JavaAPI,在工作空間創(chuàng)建Java對象和調(diào)用Java對象方法。8.1.1MATLAB外部接口簡介2023/2/4機械工業(yè)出版社Page12MATLAB的.NET接口MATLAB的.NET接口是新版本MATLAB中為實現(xiàn)MATLAB與.NET的交互而引入的接口函數(shù)。通過MATLAB的.NET接口,用戶可以在MATLAB工作空間中創(chuàng)建.NET類實例,還可以通過類成員與.NET應(yīng)用程序進行交互。8.1.1MATLAB外部接口簡介2023/2/4機械工業(yè)出版社Page13MATLAB的COM交互接口MATLAB既可以充當COM客戶,控制其它組件,也可以充當自動化服務(wù)器,被其它組件所控制。MATLAB支持四種不同的COM客戶/服務(wù)器設(shè)置方式:MATLAB客戶和進程內(nèi)服務(wù)器、MATLAB客戶和進程外服務(wù)器、客戶程序和MATLAB自動化服務(wù)器以及客戶程序和MATLAB引擎服務(wù)器。8.1.1MATLAB外部接口簡介2023/2/4機械工業(yè)出版社Page14MATLAB的WebServices接口WebServices是一種允許分布在不同區(qū)域、運行不同操作系統(tǒng)和開發(fā)環(huán)境的計算機相互間進行通信的技術(shù)。利用WebServices,客戶端可以訪問并執(zhí)行遠程服務(wù)器上所提供的Web服務(wù)。MATLAB可以充當WebServices的客戶端,通過MATLAB的WebServices接口對服務(wù)器提供的WebServices進行訪問。8.1.1MATLAB外部接口簡介2023/2/4機械工業(yè)出版社Page15MATLAB的串行I/O接口串口是計算機同外部設(shè)備進行通信的重要接口。通過MATLAB提供的串行I/O接口,用戶可以直接訪問通過串口連接在計算機上的打印機、調(diào)制解調(diào)器等外部設(shè)備。該串行I/O接口建立在串行I/O對象之上,借助該對象所支持的函數(shù)和屬性,用戶可以配置串口通信、讀寫數(shù)據(jù)并將信息記錄存盤。8.1.1MATLAB外部接口簡介2023/2/4機械工業(yè)出版社Page16C/C++語言有著龐大的用戶群和強大的生命力,在當前計算機軟件開發(fā)中占據(jù)著相當重要的位置。將MATLAB與C/C++相結(jié)合,可以發(fā)揮各自優(yōu)勢,縮短開發(fā)周期,提高開發(fā)效率。8.1.2常用MATLAB與C/C++混合編程方法2023/2/4機械工業(yè)出版社Page17使用MAT文件實現(xiàn)程序的數(shù)據(jù)交互;利用C/C++創(chuàng)建共享庫文件實現(xiàn)MATLAB對C/C++程序的調(diào)用;利用C/C++創(chuàng)建MEX文件實現(xiàn)MATLAB對C/C++程序的調(diào)用;利用MATLAB引擎實現(xiàn)C/C++對MATLAB的調(diào)用;利用MATLAB編譯器實現(xiàn)MATLAB與C/C++的混合編程;8.1.2常用MATLAB與C/C++混合編程方法2023/2/4機械工業(yè)出版社Page188.2使用MAT文件實現(xiàn)數(shù)據(jù)交互8.2.1MAT文件簡介8.2.2操作MAT文件的API8.2.3編譯和鏈接MAT程序的配置8.2.4MAT文件實現(xiàn)數(shù)據(jù)交互實例2023/2/4機械工業(yè)出版社Page19MAT文件是MATLAB專用的數(shù)據(jù)存儲格式,也是其默認的文件格式。MAT文件以.mat為后綴,文件中數(shù)據(jù)以二進制格式保存,用戶一般只能在MATLAB載入MAT文件后,通過變量編輯器實現(xiàn)對MAT文件的修改。8.2.1MAT文件簡介2023/2/4機械工業(yè)出版社Page20MAT文件由文件頭和緊隨其后的數(shù)據(jù)單位組成。MAT文件頭又可分為MATLAB的版本信息、操作平臺的信息和文件創(chuàng)建的時間共三部分。文件頭共128字節(jié),type命令可查看。8.2.1MAT文件簡介2023/2/4機械工業(yè)出版社Page21為了簡化在MATLAB之外的環(huán)境中使用MAT文件,MATLAB提供了一系列的API,用于實現(xiàn)MAT文件的讀寫。利用API對MAT文件進行讀寫,無需了解MAT文件的內(nèi)部格式,而且當MATLAB升級時,即使MAT文件的版本發(fā)生了改變也無需重寫用戶代碼。MATLAB強烈建議用戶使用MATLAB提供的API實現(xiàn)MAT文件的讀寫。8.2.2操作MAT文件的API函數(shù)2023/2/4機械工業(yè)出版社Page22操作MAT文件的API包括MAT文件函數(shù)庫和MX矩陣函數(shù)庫。MAT文件函數(shù)庫以mat為前綴,所有函數(shù)在頭文件mat.h中聲明,主要用于MAT文件的創(chuàng)建和讀寫。MX矩陣函數(shù)庫以mx為前綴,所有函數(shù)在頭文件matrix.h中進行聲明,主要用于矩陣元素的創(chuàng)建和操作。8.2.2操作MAT文件的API函數(shù)2023/2/4機械工業(yè)出版社Page238.2.2操作MAT文件的API函數(shù)函數(shù)說

明matOpen打開一個MAT文件matClose關(guān)閉一個MAT文件matGetDir獲取MAT文件中的MATLAB數(shù)組列表matGetFp獲取一個指向MAT文件的ANSIC文件指針matGetVariable從MAT文件中讀取一個MATLAB數(shù)組matPutVariable將一個MATLAB數(shù)組寫入MAT文件matGetNextVariable從MAT文件中讀取下一個MATLAB數(shù)組matDeleteVariable將一個MATLAB數(shù)組從MAT文件中刪除matPutVariableAsGlobal將一個MATLAB數(shù)組作為全局變量寫入MAT文件matGetVariableInfo從一個MAT文件中載入一個MATLAB數(shù)組頭matGetNextVariableInfo從一個MAT文件中載入下一個MATLAB數(shù)組頭2023/2/4機械工業(yè)出版社Page248.2.2操作MAT文件的API函數(shù)函數(shù)說

明mxCreateLogicalArray創(chuàng)建一個N維的邏輯mxArray類型的矩陣,初始化為falsemxCreateLogicalMatrix創(chuàng)建一個二維的邏輯mxArray類型的矩陣,初始化為falsemxCreateDoubleMatrix創(chuàng)建一個二維的雙精度浮點mxArray矩陣,初始化為0mxCreateSparse創(chuàng)建一個二維的稀疏矩陣mxCreateString按指定的字符串創(chuàng)建一個字符串數(shù)組mxCreateCellMatrix創(chuàng)建一個二維的空數(shù)組,每個元素都為NULLmxCreateStructArray用指定的字段創(chuàng)建一個N維的結(jié)構(gòu)體數(shù)組,初始化為NULLmxDestroyArray釋放由mxCreate*函數(shù)所分配的動態(tài)內(nèi)存2023/2/4機械工業(yè)出版社Page258.2.2操作MAT文件的API函數(shù)函數(shù)說

明mxGetM獲取數(shù)組第一維元素的個數(shù)mxGetN獲取數(shù)組除第一維其它維上元素的個數(shù)(矩陣的列數(shù))mxGetDimensions獲取數(shù)組各維上元素的個數(shù)mxSetM設(shè)置mxArray類型矩陣的行數(shù)mxSetN設(shè)置mxArray類型矩陣的列數(shù)mxGetPr獲取double類型數(shù)組的實部數(shù)據(jù)指針mxGetPi獲取double類型數(shù)組的虛部數(shù)據(jù)指針mxSetPr為double類型數(shù)組設(shè)置新的實部數(shù)據(jù)mxSetPi為double類型數(shù)組設(shè)置新的虛部數(shù)據(jù)2023/2/4機械工業(yè)出版社Page26為了在C/C++開發(fā)環(huán)境中編譯和鏈接調(diào)用MAT文件接口函數(shù)的程序,用戶必須進行必要的環(huán)境設(shè)置。本小節(jié)介紹在MATLAB平臺利用mex命令和在VS2005開發(fā)環(huán)境中編譯、鏈接MAT程序的環(huán)境配置。8.2.3編譯和鏈接MAT程序環(huán)境配置2023/2/4機械工業(yè)出版社Page27MATLAB平臺mex命令環(huán)境配置MATLAB借助mex命令和MAT屬性文件來實現(xiàn)C/C++MAT程序的編譯和鏈接。MAT屬性文件位于目錄【matlabroot\bin\win32\mexopts\】下,文件名為“*engmatopts.bat”,其中,*代表編譯器的類型和版本號。8.2.3編譯和鏈接MAT程序環(huán)境配置2023/2/4機械工業(yè)出版社Page28MATLAB平臺mex命令環(huán)境配置假若當前工作目錄下存在一個名為matcreat.c的C程序,利用微軟VisualC++Version8.0(VS2005)將其編譯為獨立的可執(zhí)行程序,則需要在MATLAB中輸入下面的命令行代碼:若當前操作系統(tǒng)并未安裝VisualC++Version8.0,MATLAB會提示“無法定位編譯器”的錯誤信息。8.2.3編譯和鏈接MAT程序環(huán)境配置mex-fmatlabroot\bin\win32\mexopts\msvc80engmatopts.batmatcreat.c2023/2/4機械工業(yè)出版社Page29MATLAB平臺mex命令環(huán)境配置在mex命令后加入-setup參數(shù)可查看當前系統(tǒng)安裝的C/C++和Fortran編譯器:8.2.3編譯和鏈接MAT程序環(huán)境配置>>mex-setupPleasechooseyourcompilerforbuildingexternalinterface(MEX)files:Wouldyoulikemextolocateinstalledcompilers[y]/n?ySelectacompiler:[1]Lcc-win32C2.4.1inC:\PROGRA~1\MATLAB\R2010a\sys\lcc[2]MicrosoftVisualC++2005SP1inC:\ProgramFiles\MicrosoftVisualStudio8[3]MicrosoftVisualC++6.0inC:\ProgramFiles\MicrosoftVisualStudio[0]None2023/2/4機械工業(yè)出版社Page30VS2005平臺開發(fā)MAT程序環(huán)境配置利用mex命令可以實現(xiàn)C/C++程序的編譯鏈接,當程序包含多個文件時,用這種命令行方法編譯程序就不是很方便。VisualC++是Windows系統(tǒng)下最受歡迎的C/C++開發(fā)環(huán)境,可以管理和開發(fā)大規(guī)模的C/C++程序,下面介紹在VS2005下編譯、鏈接MAT程序的環(huán)境配置。8.2.3編譯和鏈接MAT程序環(huán)境配置2023/2/4機械工業(yè)出版社Page31VS2005平臺開發(fā)MAT程序環(huán)境配置1.將【matlabroot\extern\include】加入為包含目錄(mat.h和matrix.h

所在目錄)8.2.3編譯和鏈接MAT程序環(huán)境配置2023/2/4機械工業(yè)出版社Page32VS2005平臺開發(fā)MAT程序環(huán)境配置2.【matlabroot\extern\lib\win32\microsoft】設(shè)置為庫目錄(MAT接口和矩陣庫所在目錄)8.2.3編譯和鏈接MAT程序環(huán)境配置2023/2/4機械工業(yè)出版社Page33VS2005平臺開發(fā)MAT程序環(huán)境配置3.工程屬性頁中加入對libmat.lib和libmx.lib兩個庫文件的鏈接8.2.3編譯和鏈接MAT程序環(huán)境配置2023/2/4機械工業(yè)出版社Page348.2.4MAT文件實現(xiàn)數(shù)據(jù)交互實例【例8-1】編寫C程序,通過MATAPI創(chuàng)建一個MAT文件,并在MATLAB中查看創(chuàng)建的MAT文件的內(nèi)容。為簡化代碼編寫過程,我們以MATLAB自帶的示例代碼matcreat.c為基礎(chǔ)創(chuàng)建MAT文件,具體步驟如下:2023/2/4機械工業(yè)出版社Page35在VS2005中新建一個空的VisualC++Win32控制臺應(yīng)用程序,項目名稱為“CreateMatFileTest”;將目錄【matlabroot\extern\examples\eng_mat\】下的matcreat.c拷貝到當前項目目錄中,并通過【項目】菜單下的【添加現(xiàn)有項】子菜單將文件matcreat.c加入當前工程。修改matcreat.c,保留程序創(chuàng)建MAT文件相關(guān)代碼8.2.4MAT文件實現(xiàn)數(shù)據(jù)交互實例2023/2/4機械工業(yè)出版社Page36為當前項目加入依賴連接庫文件libmat.lib和libmx.lib;編譯、鏈接工程,并運行程序;撰寫MATLAB程序,讀取MAT文件內(nèi)容具體代碼參見光盤實例源碼。8.2.4MAT文件實現(xiàn)數(shù)據(jù)交互實例2023/2/4機械工業(yè)出版社Page378.2.4MAT文件實現(xiàn)數(shù)據(jù)交互實例2023/2/4機械工業(yè)出版社Page388.3使用共享庫實現(xiàn)混合編程8.3.1MATLAB調(diào)用共享庫函數(shù)8.3.2給共享庫中的函數(shù)傳遞參數(shù)8.3.3私用libpointer/libstruct對象8.3.4使用共享庫實現(xiàn)混合編程實例2023/2/4機械工業(yè)出版社Page39

共享庫是一組可以在程序運行時動態(tài)加載的函數(shù)的集合,在windows平臺中共享庫就是動態(tài)連接庫(DLL)。在MATLAB中要訪問共享庫中的函數(shù),首先必須載入共享庫。共享庫被載入后,利用MATLAB提供的查看列表命令可以查看共享庫中包含的函數(shù),在完成函數(shù)調(diào)用后,需要卸載共享庫。8.3.1MATLAB調(diào)用共享庫函數(shù)2023/2/4機械工業(yè)出版社Page40

共享庫是一組可以在程序運行時動態(tài)加載的函數(shù)的集合,在windows平臺中共享庫就是動態(tài)連接庫(DLL)。在MATLAB中要訪問共享庫中的函數(shù),首先必須載入共享庫。共享庫被載入后,利用MATLAB提供的查看列表命令可以查看共享庫中包含的函數(shù),在完成函數(shù)調(diào)用后,需要卸載共享庫。8.3.1MATLAB調(diào)用共享庫函數(shù)2023/2/4機械工業(yè)出版社Page41共享庫載入函數(shù)函數(shù)loadlibrary載入共享庫,函數(shù)語法形式如下:loadlibrary('shrlib','hfile')shrlib是共享庫文件名稱;hfile是包含函數(shù)原型的頭文件的名稱。如:hfile=[matlabroot'\extern\include\matrix.h']8.3.1MATLAB調(diào)用共享庫函數(shù)2023/2/4機械工業(yè)出版社Page42共享庫卸載函數(shù)函數(shù)unloadlibrary卸載共享庫,函數(shù)語法形式如下:

unloadlibrary('libname')

unloadlibrary

libnamelibname:共享庫名。8.3.1MATLAB調(diào)用共享庫函數(shù)2023/2/4機械工業(yè)出版社Page43共享庫查看函數(shù)MATLAB提供了兩個查看函數(shù)。

libfunctions函數(shù)語法形式如下:m=libfunctions('libname')m=libfunctions('libname','-full')libname:共享庫名;'-full':表示顯示函數(shù)的詳細信息;m:返回值,是一個字符串型的單元陣列,包含函數(shù)信息。8.3.1MATLAB調(diào)用共享庫函數(shù)2023/2/4機械工業(yè)出版社Page44共享庫查看函數(shù)libfunctionsview函數(shù)語法形式如下:

libfunctionsview('libname')libfunctions在命令窗口中顯示共享庫中函數(shù)libfunctionsview在圖形用戶界面中顯示共享庫中函數(shù)。帶-full參數(shù)的函數(shù)返回共享庫中所有函數(shù)的完全描述。8.3.1MATLAB調(diào)用共享庫函數(shù)2023/2/4機械工業(yè)出版社Page45共享庫調(diào)用函數(shù)函數(shù)calllib調(diào)用共享庫中的函數(shù),函數(shù)語法形式如下:[x1,...,xN]=calllib('libname', 'funcname',arg1,…,argN)libname:調(diào)用函數(shù)所在共享庫的名稱;funcname:調(diào)用函數(shù)的名稱;arg1…argN:為函數(shù)傳入的參數(shù);x1…xN:函數(shù)返回值。8.3.1MATLAB調(diào)用共享庫函數(shù)2023/2/4機械工業(yè)出版社Page46C與MATLAB數(shù)據(jù)類型對應(yīng)關(guān)系8.3.2給共享庫中的函數(shù)傳遞參數(shù)C語言數(shù)據(jù)類型對應(yīng)MATLAB數(shù)據(jù)類型char,byteint8unsignedchar,byteuint8shortint16unsignedshortuint16intint32long(32bit)int32long(64bit)int64unsignedint,unsignedlonguint32floatsingledoubledouble2023/2/4機械工業(yè)出版社Page47C與MATLAB數(shù)據(jù)類型對應(yīng)關(guān)系(續(xù))8.3.2給共享庫中的函數(shù)傳遞參數(shù)C語言數(shù)據(jù)類型對應(yīng)MATLAB數(shù)據(jù)類型char*cstring(1×n字符數(shù)組)*char[]字符串單元數(shù)組int*(u)int(size)Ptr字符串cstring字符串引用stringPtr字符串指針數(shù)組stringPtrPtr有符號字節(jié)矩陣int8Ptrfloat*singlePtrdouble*doublePtrmxArray*MATLABarrayvoid*voidPtrvoid**voidPtrPtrtype**typePtrPtr2023/2/4機械工業(yè)出版社Page48參數(shù)傳遞原則非標量數(shù)據(jù)類型的函數(shù)參數(shù)必須聲明為引用調(diào)用(passbyreference);當函數(shù)參數(shù)為二維矩陣時,需要將輸入矩陣轉(zhuǎn)置后再傳給處理函數(shù),對函數(shù)的返回結(jié)果也要做轉(zhuǎn)置處理。這是因為C語言與MATLAB矩陣元素的單下標索引順序不同,前者是行優(yōu)先,而后者是列優(yōu)先;8.3.2給共享庫中的函數(shù)傳遞參數(shù)2023/2/4機械工業(yè)出版社Page49參數(shù)傳遞原則(續(xù))當函數(shù)參數(shù)是數(shù)組類型,并且數(shù)組維數(shù)在二維以上時,為保持數(shù)組形狀,需要在調(diào)用函數(shù)之前備份數(shù)組形狀信息,這樣在函數(shù)調(diào)用后就可以利用備份的數(shù)組形狀信息恢復(fù)數(shù)組原來的形狀;當函數(shù)參數(shù)為指針類型時,用空數(shù)組[]來傳遞一個NULL參數(shù)值。8.3.2給共享庫中的函數(shù)傳遞參數(shù)2023/2/4機械工業(yè)出版社Page50傳遞原生類型參數(shù)當需要傳遞的函數(shù)參數(shù)為MATLAB原生數(shù)據(jù)類型時,MATLAB自動將MATLAB中的數(shù)據(jù)轉(zhuǎn)換為外部函數(shù)參數(shù)所需的數(shù)據(jù)類型。例如,外部函數(shù)輸入?yún)?shù)為short類型,用戶可以將double類型的數(shù)據(jù)作為輸入?yún)?shù)傳入,MATLAB會自動將double類型數(shù)據(jù)轉(zhuǎn)換為外部函數(shù)所需的short類型參數(shù)。8.3.2給共享庫中的函數(shù)傳遞參數(shù)2023/2/4機械工業(yè)出版社Page51傳遞字符串參數(shù)當外部共享庫函數(shù)包含char*型參數(shù)時,可以將MATLAB字符串作為參數(shù)傳入,即MATLAB中的字符串等同于C語言中的char*。即:MATLAB中的cstring變量與共享庫函數(shù)中的char*變量相對應(yīng)。8.3.2給共享庫中的函數(shù)傳遞參數(shù)2023/2/4機械工業(yè)出版社Page52傳遞指針參數(shù)若共享庫中函數(shù)的參數(shù)為引用型參數(shù)(指針或引用),傳入對應(yīng)的數(shù)值型參數(shù)即可,MATLAB會自動將傳入的數(shù)值型參數(shù)轉(zhuǎn)換為對應(yīng)的引用型參數(shù)。

如:8.3.2給共享庫中的函數(shù)傳遞參數(shù)doubleaddDoubloeByRef(doublex,double*y);calllib(‘libname’,‘a(chǎn)ddDoubleByRef’,1.5,2,6)2023/2/4機械工業(yè)出版社Page53很多時候,需要傳入引用型參數(shù)而不能傳入數(shù)值型參數(shù)。如想對輸入?yún)?shù)的值進行更改或傳入的數(shù)據(jù)占用很多的存儲空間時,就需要使用引用型參數(shù)。針對上述情況,MATLAB為用戶提供了libpointer對象和libstruct對象。8.3.3使用libpointer/libstruct對象傳遞參數(shù)2023/2/4機械工業(yè)出版社Page54創(chuàng)建libpointer對象libpointer函數(shù)用來創(chuàng)建libpointer對象,函數(shù)語法形式如下:p=libpointer('type','value')type:創(chuàng)建指針所指向的數(shù)據(jù)類型,如int32Ptr等;value:為指針對象賦予的初始值;p:返回的指針對象。8.3.3使用libpointer/libstruct對象傳遞參數(shù)2023/2/4機械工業(yè)出版社Page55創(chuàng)建指向原生數(shù)據(jù)類型變量的指針假如存在double型變量x,現(xiàn)在需要創(chuàng)建一個指向x的libpointer對象,代碼如下:8.3.3使用libpointer/libstruct對象傳遞參數(shù)>>x=10;>>xp=libpointer('doublePtr',x);>>get(xp)Value:10

DataType:'doublePtr'xp即是我們創(chuàng)建的指向變量x的double類型libpointer對象。2023/2/4機械工業(yè)出版社Page56通過既有l(wèi)ibpointer創(chuàng)建指針在已有l(wèi)ibpointer對象的基礎(chǔ)上,利用加號運算符(+)用戶很容易創(chuàng)建新的libpointer對象。創(chuàng)建新指針的過程與C語言中利用偏移創(chuàng)建新指針類似。8.3.3使用libpointer/libstruct對象傳遞參數(shù)>>x=1:8;>>xp=libpointer('doublePtr',x);>>xp2=xp+3;>>xp2.Valueans=456782023/2/4機械工業(yè)出版社Page57MEX文件是用C/C++或Fortran編寫,遵循MEX文件格式的,可被MATLAB直接調(diào)用的一種文件。MATLA將MEX文件中的函數(shù)視為它的內(nèi)建函數(shù),MATLAB解釋器可以自動載入并執(zhí)行它們。MEX文件有二進制MEX文件和MEX源文件之分,一般情況下指的是二進制MEX文件。8.4.1MEX文件簡介2023/2/4機械工業(yè)出版社Page58利用libpointer創(chuàng)建指向結(jié)構(gòu)體的指針當函數(shù)的參數(shù)為結(jié)構(gòu)體類型時,傳入的參數(shù)可以是結(jié)構(gòu)體也是以是指向結(jié)構(gòu)體的指針。8.3.3使用libpointer/libstruct對象傳遞參數(shù)>>sx.v1=499.99;sx.v2=122;sx.v3=-210;>>sp=libpointer('c_struct',sx);>>sp.Valueans=v1:499.99v2:122v3:-210struct

c_struct{doublev1;shortv2;longv3;};2023/2/4機械工業(yè)出版社Page59利用libstruct創(chuàng)建指向結(jié)構(gòu)體的指針libstruct函數(shù)也可用于創(chuàng)建結(jié)構(gòu)體對象,libstruct語法形式如下:

s=libstruct('structtype',mlstruct)'structtype':指定所創(chuàng)建對象的結(jié)構(gòu)體類型mlstruct:為所創(chuàng)建結(jié)構(gòu)體對象賦予的初值s:返回所創(chuàng)建的libstruct對象。8.3.3使用libpointer/libstruct對象傳遞參數(shù)根據(jù)C語言中的結(jié)構(gòu)體類型structtype來創(chuàng)建libstruct對象,并根據(jù)mlstruct為對象的域賦初值。2023/2/4機械工業(yè)出版社Page608.3.4使用共享庫實現(xiàn)混合編程實例【例8-2】已知共享庫libname中包含函數(shù)addDoubleByRef和addStructByRef,定義如下頁,編寫MATLAB程序,利用libpointer對象和libstruct對象傳遞參數(shù)調(diào)用函數(shù)。(假定libname共享庫的頭文件為libname.h)2023/2/4機械工業(yè)出版社Page618.3.4使用共享庫實現(xiàn)混合編程實例doubleaddDoubleByRef(doublex,double*yp){ returnx+*y;}struct

c_struct{doublev1;shortv2;longv3;};doubleaddStructByRef(struct

c_struct*st){ doublet=st->v1+st->v2+st->v3;

st->v1*=2;

st->v2*=2;

st->v2*=2; returnt;}2023/2/4機械工業(yè)出版社Page62loadlibrary('libname','libname.h')

%裝載libname共享庫x=1.2;%創(chuàng)建doublePtr類型libpointer對象yp=libpointer('doublePtr',x);

%調(diào)用函數(shù)addDoubleByRefcalllib('libname','addDoubleByRef',2.3,yp);

%創(chuàng)建結(jié)構(gòu)體對象smsm.v1=1.2;sm.v2=-27;sm.v3=145;%利用sm創(chuàng)建指向結(jié)構(gòu)體的指針sp=libpointer('c_struct',sm);

calllib('libname','addStructByRef',sm)

%傳入結(jié)構(gòu)體對象calllib(‘libname’,‘a(chǎn)ddStructByRef’,sp)

%傳入libpointer對象%利用sm創(chuàng)建指向結(jié)構(gòu)體的指針sc=libstruct('c_struct',sm);

%調(diào)用函數(shù)addStructByRef,傳入calllib('libname','addStructByRef',sc)

get(sc)%get函數(shù)查看sc的值unloadlibrary

libname

%卸載libname共享庫2023/2/4機械工業(yè)出版社Page638.4使用MEX文件實現(xiàn)混合編程8.4.1MEX文件簡介8.4.2使用MEX文件環(huán)境配置8.4.3C語言MEX函數(shù)8.4.4C語言創(chuàng)建MEX文件實例8.4.5C++語言創(chuàng)建MEX文件實例2023/2/4機械工業(yè)出版社Page64MEX文件是用C/C++或Fortran編寫,遵循MEX文件格式的,可被MATLAB直接調(diào)用的一種文件。MATLA將MEX文件中的函數(shù)視為它的內(nèi)建函數(shù),MATLAB解釋器可以自動載入并執(zhí)行它們。MEX文件有二進制MEX文件和MEX源文件之分,一般情況下指的是二進制MEX文件。8.4.1MEX文件簡介2023/2/4機械工業(yè)出版社Page65MEX文件用途可以直接調(diào)用已有的大量C/C++或者Fortran程序,而無需將他們用MATLAB重新改寫;用C/C++或者Frotran語言編寫那些在MATLAB中運算速度過慢的算法以提高效率,如包含大量的逐元素處理的循環(huán)運算等直接控制硬件,如A/D采集卡,D/A輸出卡等,以用于數(shù)據(jù)采集或控制應(yīng)用。8.4.1MEX文件簡介2023/2/4機械工業(yè)出版社Page66MEX源文件結(jié)構(gòu)MEX源文件是指用C/C++或Fortan語言所編寫的遵循MEX文件格式的源代碼文件。C語言MEX源文件由三部分組成:第一部分:頭文件包含及宏定義;第二部分:計算例程,即在MEX源文件中完成計算功能的程序代碼,計算程序可以是普通的C/C++程序,按照C/C++語言規(guī)則編寫即可;第三部分:入口例程,即將計算例程與MATLAB連接的入口函數(shù)mexFunction。8.4.1MEX文件簡介2023/2/4機械工業(yè)出版社Page67MEX源文件結(jié)構(gòu)-mexFunction聲明8.4.1MEX文件簡介voidmexFunction(

int

nlhs, /*期望輸出參數(shù)個數(shù)*/

mxArray*plhs[], /*指向輸出參數(shù)的指針數(shù)組*/

int

nrhs, /*期望的輸入?yún)?shù)個數(shù)*/constmxArray*prhs[] /*執(zhí)行輸入?yún)?shù)的指針數(shù)組*/)nlhs:輸出數(shù)據(jù)的個數(shù);plhs:指向mxArray類型輸出數(shù)據(jù)的指針;nrhs:輸入數(shù)據(jù)的個數(shù);prhs:指向mxArray類型輸入數(shù)據(jù)的指針。2023/2/4機械工業(yè)出版社Page68二進制MEX文件二進制MEX文件是程序運行時動態(tài)加載的一種共享庫。二進制MEX文件有自己的平臺無關(guān)的后綴,用mex命令創(chuàng)建二進制MEX文件時該后綴會自動生成。在32位Windows平臺中,二進制MEX文件的后綴是.mexw32,在64位Windows平臺中,其后綴為.mexw64。未來版本本,dll后綴MEX文件不再支持。8.4.1MEX文件簡介2023/2/4機械工業(yè)出版社Page69在8.2.3中,已經(jīng)對mex命令的環(huán)境配置做過初步介紹,這里基于WindowsXP操作系統(tǒng)和MATLAB2010a,詳細介紹mex命令的環(huán)境配置。8.4.2使用MEX文件的環(huán)境配置

在MATLAB命令提示符下,輸入mex配置命令,顯示如下信息:>>mex-setupPleasechooseyourcompilerforbuildingexternalinterface(MEX)files:Wouldyoulikemextolocateinstalledcompilers[y]/n?2023/2/4機械工業(yè)出版社Page70選擇“y”,mex命令會列出找到的MATLAB所支持的指編譯器及其安裝目錄,如:8.4.2使用MEX文件的環(huán)境配置Selectacompiler:[1]Lcc-win32C2.4.1in C:\PROGRA~1\MATLAB\R2010a\sys\lcc[2]MicrosoftVisualC++2005SP1inC:\Program Files\MicrosoftVisualStudio8[3]MicrosoftVisualC++6.0inC:\Program Files\MicrosoftVisualStudio[0]None2023/2/4機械工業(yè)出版社Page71選擇[1]-[3]中的任一項,mex命令將給出提示信息:8.4.2使用MEX文件的環(huán)境配置Compiler:MicrosoftVisualC++2005SP1Location:C:\ProgramFiles\MicrosoftVisualStudio8

Arethesecorrect[y]/n?2023/2/4機械工業(yè)出版社Page72確認所選擇編譯器及安裝路徑正確無誤后,選擇“y”,mex命令將對系統(tǒng)進行配置,若成功將給出如下提示:8.4.2使用MEX文件的環(huán)境配置Tryingtoupdateoptionsfile:C:\DocumentsandSettings\Administrator\ApplicationData\MathWorks\MATLAB\R2010a\mexopts.bat

Fromtemplate:C:\PROGRA~1\MATLAB\R2010a\bin\win32\mexopts\msvc80opts.bat

Done...2023/2/4機械工業(yè)出版社Page73MEX編譯選項設(shè)置mex命令要借助編譯選項來實現(xiàn)MEX文件的編譯。mex命令的語法形式為:

mexfilename-foptionsfile-f參數(shù)指明使用選項文件optionsfile來編譯MEX文件;當mex命令不指定選項文件時,MATLAB使用默認的選項文件。8.4.2使用MEX文件的環(huán)境配置2023/2/4機械工業(yè)出版社Page74戶也可以利用VS2005平臺創(chuàng)建MEX文件。用C/C++語言開發(fā)MEX程序,一般要調(diào)用MEX函數(shù)庫(libmex.dll)和矩陣函數(shù)庫(libmx.dll),要實現(xiàn)MEX程序的正確編譯,用戶必須首先對VS2005的包含文件目錄和庫文件目錄進行配置,然后加入相應(yīng)庫文件的鏈接即可。8.4.2使用MEX文件的環(huán)境配置2023/2/4機械工業(yè)出版社Page75

MEX函數(shù)庫是MATLAB外部程序接口函數(shù)庫提供的一系列函數(shù),它們均以mex為前綴,主要實現(xiàn)與MATLAB環(huán)境的交互。下頁表中列出了MATLABC語言MEX函數(shù)庫提供的接口函數(shù)及其功能介紹。8.4.3C語言MEX函數(shù)2023/2/4機械工業(yè)出版社Page76函數(shù)功能介紹mexAtExit登記一個函數(shù),該函數(shù)在MEX文件被清除或者MATLAB終止執(zhí)行時被調(diào)用,用來完成釋放內(nèi)存等善后工作mexCallMATLAB調(diào)用MATLAB自建函數(shù)、用戶自定義函數(shù)或MEX文件mexCallMATLABWithTrap調(diào)用MATLAB自建函數(shù)、用戶自定義函數(shù)或MEX文件,并捕獲函數(shù)運行的錯誤信息mexErrMsgIdAndTxt輸出帶標識符的錯誤信息,并返回到MATLAB命令提示符下mexErrMsgTxt輸出錯誤信息,并返回到MATLAB命令提示符下mexEvalString在調(diào)用者工作空間執(zhí)行MATLAB命令mexEvalStringWithTrap在調(diào)用者工作空間執(zhí)行MATLAB命令,并捕獲函數(shù)運行的錯誤信息mexFunctionC/C++和Fortran語言MEX文件的入口點函數(shù)mexFunctionName獲取當前執(zhí)行MEX文件的文件名mexGet獲取某一指定圖像句柄的屬性2023/2/4機械工業(yè)出版社Page77函數(shù)功能介紹mexGetVariable獲取特定工作空間中變量的拷貝mexGetVariablePtr獲取另一個工作空間中變量的只讀指針mexIsGlobal判斷mxArray變量是否具有作用域mexIsLocked判斷MEX文件是否處于鎖定狀態(tài)mexLock鎖定一個MEX文件mexMakeArrayPersistent將一個mxArray變量轉(zhuǎn)換為持久陣列對象mexMakeMemoryPersistent將MATLAB程序內(nèi)存轉(zhuǎn)換為持久陣列對象mexPrint與C語言的輸出函數(shù)Printf的輸出功能相同mexPutVariable將mxArray變量從MEX函數(shù)中復(fù)制到指定工作空間mexSet用于設(shè)定某個圖形句柄對象的屬性值mexSetTrapFlag控制mexCallMATLAB函數(shù)對錯誤處理的響應(yīng)mexUnlock解鎖MEX文件,將MEX文件從內(nèi)存中清除mexWarnMsgIdAndTxt輸出帶標識符的警告信息mexWarnMsgTxt輸出警告信息2023/2/4機械工業(yè)出版社Page788.4.4C語言創(chuàng)建MEX文件實例【例8-3】利用C語言創(chuàng)建MEX文件示例:編寫C程序?qū)崿F(xiàn)標量與數(shù)組相乘實例源碼見文件arrayProduct.c,該文件包括三個部分:第一部分:包含MEX函數(shù)庫頭文件第二部分:計算例程第三部分:入口例程函數(shù)2023/2/4機械工業(yè)出版社Page798.4.4C語言創(chuàng)建MEX文件實例/*第一部分:包含MEX函數(shù)庫頭文件*/#include"mex.h“/*第二部分:計算例程*/voidarrayProduct(doublex,double*y,double*z,

mwSizen){

mwSizei;/*multiplyeachelementybyx*/for(i=0;i<n;i++){

z[i]=x*y[i];}}2023/2/4機械工業(yè)出版社Page808.4.4C語言創(chuàng)建MEX文件實例/*第三部分:入口例程函數(shù)*/voidmexFunction(int

nlhs,mxArray*plhs[],

int

nrhs,constmxArray*prhs[]){doublemultiplier;/*inputscalar*/double*inMatrix;/*1xNinputmatrix*/

mwSize

ncols;/*sizeofmatrix*/double*outMatrix;/*outputmatrix*/

/*檢查輸入輸出參數(shù)個數(shù)是否正確*/

if(nrhs!=2){}

if(nlhs!=1){}/*確認第一個輸入?yún)?shù)為標量*/if(!mxIsDouble(prhs[0])||mxIsComplex(prhs[0])||mxGetNumberOfElements(prhs[0])!=1){}2023/2/4機械工業(yè)出版社Page818.4.4C語言創(chuàng)建MEX文件實例/*確認第二個輸入?yún)?shù)只有一行,即為一維數(shù)組*/if(mxGetM(prhs[1])!=1){}

/*獲取參數(shù)*/multiplier=mxGetScalar(prhs[0]);

inMatrix=mxGetPr(prhs[1]);

ncols=mxGetN(prhs[1]);plhs[0]=mxCreateDoubleMatrix(1,ncols,mxREAL);

outMatrix=mxGetPr(plhs[0]);

/*調(diào)用計算例程*/

arrayProduct(multiplier,inMatrix,outMatrix,ncols);}2023/2/4機械工業(yè)出版社Page828.4.4C語言創(chuàng)建MEX文件實例利用mex命令或VS2005編譯文件arrayProduct.c,生成MEX文件arrayProduct.mexw32,在MATLAB中調(diào)用arrayProduct函數(shù),結(jié)果如下:>>A=arrayProduct(2,[1:4])A=24682023/2/4機械工業(yè)出版社Page838.4.5C++語言創(chuàng)建MEX文件實例【例8-4】用C++語言創(chuàng)建MEX文件示例:定義一個類MyData,創(chuàng)建該類的實例對象,并為對象賦值,顯示對象賦值前后的內(nèi)容。實例源碼請參見光盤:例8-4目錄下的mexcpp.cpp文件。2023/2/4機械工業(yè)出版社Page848.4.5C++語言創(chuàng)建MEX文件實例C++語言MEX源文件結(jié)構(gòu)與例8-3中的C語言MEX源文件結(jié)構(gòu)類似,同樣也包含三個主要部分:頭文件包含部分、計算例程和入口例程;不同的是,C++語言撰寫的MEX源文件中增加了類的定義,并在計算例程中創(chuàng)建類的對象,并調(diào)用對象的函數(shù),在對象使用完畢需要釋放對象。2023/2/4機械工業(yè)出版社Page858.4.5C++語言創(chuàng)建MEX文件實例利用mex命令或VS2005編譯文件mexcpp.cpp,生成文件mexcpp.mexw32,在MATLAB中調(diào)用mexcpp函數(shù),結(jié)果如下:>>mexcpp(2,3)Theinitializeddatainobject:Value1=0Value2=0Aftersettingtheobject'sdatatoyourinput:Value1=2Value2=32023/2/4機械工業(yè)出版社Page868.5使用MATLAB引擎實現(xiàn)混合編程8.5.1MATLAB引擎簡介8.5.2MATLAB引擎函數(shù)8.5.3MATLAB引擎的使用8.5.4VS2005開發(fā)MATLAB引擎實例2023/2/4機械工業(yè)出版社Page87MATLAB引擎是MATLAB提供的一組外部接口函數(shù)。通過這些接口函數(shù),用戶可以在C和Fortran等高級編程語言中實現(xiàn)對MATLAB的控制,將MATLAB作為一種計算引擎使用。8.5.1MATLAB引擎簡介2023/2/4機械工業(yè)出版社Page88MATLAB引擎程序采用C、C++或Fortran語言編寫,通過引擎接口與MATLAB進行交互。在UNIX系統(tǒng)中,引擎程序通過通道來和一個獨立的MATLAB進程通信,在Windows系統(tǒng)中,則是通過組件對象模型(COM)接口來與MATLAB進行交互。8.5.1MATLAB引擎簡介2023/2/4機械工業(yè)出版社Page89借助MATLAB引擎,用戶可以實現(xiàn):在C/C++中調(diào)用MATLAB的數(shù)學(xué)函數(shù)或子程序來完成數(shù)據(jù)的處理。在C/C++中調(diào)用MATLAB來構(gòu)建針對某個特殊任務(wù)的整個系統(tǒng)。將MATLAB部署在計算能力更強的計算機上,通過網(wǎng)絡(luò)運行MATLAB引擎實現(xiàn)資源的充分利用。8.5.1MATLAB引擎簡介2023/2/4機械工業(yè)出版社Page90MATLAB引擎庫包含一系列從外部應(yīng)用程序調(diào)用和控制MATLAB引擎的函數(shù)。這些函數(shù)以eng為前綴,其C語言接口函數(shù)聲明都包含在頭文件engine.h中。下頁表中列出了MATLAB引擎接口函數(shù)及其功能介紹。8.5.2MATLAB引擎函數(shù)2023/2/4機械工業(yè)出版社Page918.5.2MATLAB引擎函數(shù)函數(shù)功能介紹engOpen啟動MATLAB計算引擎engClose關(guān)閉MATLAB引擎engGetVariable從MATLAB工作空間獲得一個MATLAB數(shù)組engPutVariable將指定名稱的MATLAB數(shù)組存入MATLAB工作空間engEvalString執(zhí)行一個MATLAB命令engOutputBuffer創(chuàng)建字符緩沖區(qū),以獲取MATLAB文本輸出engOpenSingleUse打開一個單獨的非共享的MATLAB計算引擎engGetVisible返回MATLAB引擎顯示狀態(tài)engSetVisible設(shè)置MATLAB引擎的顯示或隱藏狀態(tài)2023/2/4機械工業(yè)出版社Page92在外部程序中調(diào)用MATLAB引擎,大致包含如下幾個步驟:打開MATALAB引擎;將輸入數(shù)據(jù)轉(zhuǎn)換成MATLAB引擎空間中使用的形式;將上一步轉(zhuǎn)換得到的數(shù)據(jù)放入MATLAB計算引擎的工作空間;8.5.3MATLAB引擎的使用2023/2/4機械工業(yè)出版社Page93調(diào)用函數(shù)engEvalString向MATLAB引擎發(fā)送命令字符串,執(zhí)行MATLAB操作或運算;從預(yù)先定義的緩沖區(qū)獲取MATLAB引擎的輸出結(jié)果;關(guān)閉引擎,釋放內(nèi)存空間。8.5.3MATLAB引擎的使用2023/2/4機械工業(yè)出版社Page948.5.3MATLAB引擎的使用【例8-5】C語言調(diào)用MATLAB引擎示例。編寫C程序,給定時間數(shù)組T,利用MATLAB引擎計算距離為時間的函數(shù)D=.5.*(-9.8).*T.^2;"),并調(diào)用MATLAB繪圖函數(shù)plot繪制二維曲線,最后將計算結(jié)果打印到控制臺中。一維時間數(shù)組T=[0.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0]2023/2/4機械工業(yè)出版社Page958.5.3MATLAB引擎的使用源碼engdemo.c包括六個步驟:步驟一:開啟MATLAB引擎;步驟二:創(chuàng)建mxArray類型變量T,并將C語言數(shù)組time中數(shù)據(jù)拷貝到T中;步驟三:將變量T載入MATLAB工作空間步驟四:向MATLAB引擎?zhèn)鬟f命令,計算距離為時間的函數(shù)并繪制結(jié)果;步驟五:獲取計算結(jié)果;步驟六:釋放內(nèi)存空間,關(guān)閉引擎2023/2/4機械工業(yè)出版社Page96VS2005是Windows平臺下非常出色的C/C++開發(fā)工具,本小節(jié)介紹如何在VS2005中開發(fā)MATLAB引擎程序。8.5.4VS2005開發(fā)引擎程序?qū)嵗?023/2/4機械工業(yè)出版社Page97VS2005環(huán)境配置

將目錄【matlabroot\extern\include】配置為VS2005的包含文件目錄;【matlabroot\extern\lib\win32\microsoft】配置為VS2005的庫文件目錄;將MEX函數(shù)庫(libmex.dll)和矩陣函數(shù)庫(libmx.dll)加為工程的鏈接文件。

具體步驟可參考節(jié)8.2.3。8.5.4VS2005開發(fā)引擎程序?qū)嵗?023/2/4機械工業(yè)出版社Page98VS2005平臺開發(fā)MATLAB引擎程序新建一個空的Win32控制臺應(yīng)用程序項目;8.5.4VS2005開發(fā)引擎程序?qū)嵗?023/2/4機械工業(yè)出版社Page99VS2005平臺開發(fā)MATLAB引擎程序?qū)⒗?-5中的源代碼engdemo.c拷貝至項目engdemo工作目錄下,并添加至當前工程;按照前面講述的連接庫導(dǎo)入方式在項目配置屬性中導(dǎo)入libmex.lib、libmx.lib和libeng.lib三個庫文件;編譯運行程序。程序運行結(jié)果如下兩頁圖所示。8.5.4VS2005開發(fā)引擎程序?qū)嵗?023/2/4機械工業(yè)出版社Page1008.5.4VS2005開發(fā)引擎程序?qū)嵗?023/2/4機械工業(yè)出版社Page1018.5.4VS2005開發(fā)引擎程序?qū)嵗?023/2/4機械工業(yè)出版社Page1028.6使用MATLAB編譯器實現(xiàn)混合編程8.6.1MATLAB編譯器簡介8.6.2編譯器的安裝與配置8.6.3編譯和部署MATLAB程序8.6.4使用編譯器混合編程實例2023/2/4機械工業(yè)出版社Page103MATLAB編譯器是MATLAB環(huán)境下的編譯工具。它能將M文件轉(zhuǎn)換成C/C++等不同類型的源代碼,并在此基礎(chǔ)上根據(jù)需要生成MEX文件或可獨立運行的應(yīng)用程序文件,從而大大提供代碼的執(zhí)行效率。與前面介紹的MATLAB引擎和MEX文件相比,有著更高的執(zhí)行效率和更廣泛的應(yīng)用范圍。8.6.1MATLAB編譯器簡介2023/2/4機械工業(yè)出版社Page104MATLAB編譯器的使用

MATLAB編譯器利用mcc命令將M文件轉(zhuǎn)換為C/C++文件,同時生成一個相應(yīng)的包裹文件。該包裹文件包含編譯器產(chǎn)生的代碼和它所支持的可執(zhí)行文件類型之間所必須的接口。利用該包裹文件提供的接口,生成的C/C++文件可用于創(chuàng)建C/C++編譯器所支持的多種類型可執(zhí)行文件。8.6.1MATLAB編譯器簡介2023/2/4機械工業(yè)出版社Page105MATLAB編譯器的使用

mcc命令的語法形式如下:mcc[options]mfile1[mfile2…mfileN]… [C/C++file1…C/C++fileN]options:指定函數(shù)的編譯參數(shù);mfile1…mfileN:需編譯的m文件;C/C++file1…C/C++fileN:需編譯的C/C++文件。8.6.1MATLAB編譯器簡介2023/2/4機械工業(yè)出版社Page106MATLAB編譯器的使用

常用的options參數(shù)包括:-m:生成可獨立運行應(yīng)用程序,等同于–Wmain–Tlink:exe;-l:生成函數(shù)庫,等同于–Wlib–Tlink:lib;-I:指定新的包含目錄;-g:編譯時生成調(diào)式信息;-d:指定輸出目錄。8.6.1MATLAB編譯器簡介2023/2/4機械工業(yè)出版社Page107MATLAB編譯器的使用

常用的options參數(shù)包括:-T<option>:指定編譯步驟和目標文件類,option可以是codegen、compile:exe、compile:lib、link:exe或link:lib;-W<option>:指定生成包裹函數(shù)的類型,option可以是main、lib:<string>、cpplib:<string>或non。8.6.1MATLAB編譯器簡介2023/2/4機械工業(yè)出版社Page108MATLAB編譯器的使用

mcc命令常見的幾種使用方式:-mcc–mmfile1mfile2mcc–m–Iincludepath–doutputpath

mfilemcc–lmfilemcc–Wlib:libname–Tlink:libmfile1mfile28.6.1MATLAB編譯器簡介除mcc命令外,MATLAB還為用戶提供了圖形化的編譯、部署工具DeploymentTool,其使用在第9章中介紹。2023/2/4機械工業(yè)出版社Page109編譯M文件的原因可以獲得更快的運行速度;可以實現(xiàn)算法的隱藏;能夠縮短項目開發(fā)周期;無需MATLAB計算環(huán)境的支持就可創(chuàng)建可獨立運行的應(yīng)用程序和共享庫。8.6.1MATLAB編譯器簡介2023/2/4機械工業(yè)出版社Page110MATLAB編譯器的局限不能編譯腳本M文件;不能編譯使用對象的M文件;不用編譯使用input和eval語句操作工作空間變量的M文件;不能編譯動態(tài)命名;不講編譯MATLAB內(nèi)建函數(shù)。8.6.1MATLAB編譯器簡介2023/2/4機械工業(yè)出版社Page111在使用MATLAB編譯器之前,需要安裝MATLAB編譯器和相關(guān)的C/C++編譯器,并進行相關(guān)配置。8.6.2編譯器的安裝與配置2023/2/4機械工業(yè)出版社Page112安裝MATLAB編譯器

在安裝MATLAB編譯器之前,需要安裝一個或多個與MATLAB兼容的ANSIC/C++編譯器,包括Lcc(MATLAB自帶的C語言編譯器,不能編譯C++代碼)、MicrosoftVisualC++、gcc和g++。MATLAB編譯器是MATLAB的一個組件,在MATLAB2010a中版本為4.12,在安裝MATLAB2010a時選中該組件即可。8.6.2編譯器的安裝與配置2023/2/4機械工業(yè)出版社Page1138.6.2編譯器的安裝與配置2023/2/4機械工業(yè)出版社Page114配置MATLAB編譯器

MATLAB編譯器只是完成m文件到C/C++文件的轉(zhuǎn)換,C/C++代碼的編譯是調(diào)用mbuild命令來完成的。所以在完成C/C++編譯器和MATLAB編譯器的安裝后,還需要對mbuild進行配置。8.6.2編譯器的安裝與配置2023/2/4機械工業(yè)出版社Page115配置MATLAB編譯器

在MATLAB命令提示符下,輸入mbuild配置命令:

系統(tǒng)將顯示如下內(nèi)容:8.6.2編譯器的安裝與配置>>mbuild-setupPleasechooseyourcompilerforbuildingexternalinterface(MEX)files:Wouldyoulikembuildtolocateinstalledcompilers[y]/n?2023/2/4機械工業(yè)出版社Page116配置MATLAB編譯器

輸入“y”,mbuild命令會列出找到的MATLAB所支持的指編譯器及其安裝目錄,如下所示:

8.6.2編譯器的安裝與配置Selectacompiler:[1]Lcc-win32C2.4.1in C:\PROGRA~1\MATLAB\R2010a\sys\lcc[2]MicrosoftVisualC++2005SP1inC:\Program Files\MicrosoftVisualStudio8[3]MicrosoftVisualC++6.0inC:\Program Files\MicrosoftVisualStudio[0]None2023/2/4機械工業(yè)出版社Page117配置MATLAB編譯器

選擇[1]-[3]中的任一項,mbuild命令將給出提示信息。選擇2給出的提示信息如下:8.6.2編譯器的安裝與配置Compiler:MicrosoftVisualC++2005SP1Locati

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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

提交評論