




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
2023/2/4機(jī)械工業(yè)出版社Page1第8章MATLAB與C/C++混合編程【學(xué)習(xí)目標(biāo)】了解MATLAB的外部編程接口熟悉MATLAB與C/C++的混合編程方法掌握使用MAT文件按實(shí)現(xiàn)數(shù)據(jù)交互掌握使用共享庫(kù)實(shí)現(xiàn)混合編程掌握使用MEX文件實(shí)現(xiàn)混合編程掌握使用MATLAB引擎實(shí)現(xiàn)混合編程掌握使用編譯器實(shí)現(xiàn)混合編程2023/2/4機(jī)械工業(yè)出版社Page2第8章MATLAB與C/C++混合編程MATLAB混合編程該韓素8.1使用MAT文件實(shí)現(xiàn)數(shù)據(jù)交互8.2使用共享庫(kù)實(shí)現(xiàn)混合編程8.3使用MEX文件實(shí)現(xiàn)混合編程8.4使用MATLAB編譯器實(shí)現(xiàn)混合編程8.6使用MATLAB引擎實(shí)現(xiàn)混合編程8.52023/2/4機(jī)械工業(yè)出版社Page38.1MATLAB混合編程概述8.1.1MATLAB外部接口簡(jiǎn)介8.1.2常用MATLAB與C/C++混合編程方法2023/2/4機(jī)械工業(yè)出版社Page4MATLAB應(yīng)用程序接口是MATLAB與外部程序和數(shù)據(jù)進(jìn)行交互的通道,通過(guò)MATLAB應(yīng)用程序接口,可以實(shí)現(xiàn)MATLAB與其它高級(jí)編程語(yǔ)言的混合編程。8.1.1MATLAB外部接口簡(jiǎn)介2023/2/4機(jī)械工業(yè)出版社Page5MATLAB提供的外部接口包括:數(shù)據(jù)共享接口、外部程序接口、COM客戶(hù)端和服務(wù)器自動(dòng)化接口以及外設(shè)數(shù)據(jù)交換接口。另外,MATLAB還為用戶(hù)提供了MATLAB編譯器,可進(jìn)一步發(fā)揮MATLAB的計(jì)算與圖形操作威力。8.1.1MATLAB外部接口簡(jiǎn)介2023/2/4機(jī)械工業(yè)出版社Page6MATLAB數(shù)據(jù)交互接口MATLAB通過(guò)MAT文件與其它編程平臺(tái)實(shí)現(xiàn)數(shù)據(jù)交互。MAT文件是MATLAB數(shù)據(jù)存儲(chǔ)默認(rèn)的文件格式,其文件名以.mat為后綴。MATLAB為用戶(hù)提供了一系列操作MAT文件的API函數(shù),可以利用這些函數(shù)實(shí)現(xiàn)對(duì)MAT文件的訪(fǎng)問(wèn)。8.1.1MATLAB外部接口簡(jiǎn)介2023/2/4機(jī)械工業(yè)出版社Page7MATLAB共享庫(kù)接口共享庫(kù)是一組可以在程序運(yùn)行時(shí)動(dòng)態(tài)加載的函數(shù)的集合,不同平臺(tái)下的共享庫(kù)有不同的形式;Windows的共享庫(kù)是指動(dòng)態(tài)連接庫(kù),后綴為.dll,UNIX和Linux下的共享庫(kù)是指共享對(duì)象文件,后綴為.so。MATLAB提供在MATLAB中調(diào)用共享庫(kù)的接口函數(shù),可以實(shí)現(xiàn)共享庫(kù)的加載、釋放、參數(shù)傳遞和函數(shù)調(diào)用等操作。8.1.1MATLAB外部接口簡(jiǎn)介2023/2/4機(jī)械工業(yè)出版社Page8MATLAB外部程序接口MATLAB通過(guò)MEX文件實(shí)現(xiàn)與外部程序的連接。MEX是MATLABExecutable的縮寫(xiě),即MATLAB可執(zhí)行程序。MEX文件是MATLAB調(diào)用其它編程語(yǔ)言編寫(xiě)的程序或算法的接口,符合MATLAB的調(diào)用格式,可以被MATLAB解釋器載入執(zhí)行。8.1.1MATLAB外部接口簡(jiǎn)介2023/2/4機(jī)械工業(yè)出版社Page9MATLAB引擎MATLAB引擎是一組允許用戶(hù)在其它應(yīng)用程序中與MATLAB交互的函數(shù)接口庫(kù)。通過(guò)這些接口函數(shù),用戶(hù)可以在C、C++和Fortran等高級(jí)編程語(yǔ)言中實(shí)現(xiàn)對(duì)MATLAB的控制,將MATLAB作為一種計(jì)算引擎使用。8.1.1MATLAB外部接口簡(jiǎn)介2023/2/4機(jī)械工業(yè)出版社Page10MATLAB編譯器MATLAB編譯器是MATLAB環(huán)境下的編譯工具,它能將M文件轉(zhuǎn)換為C或C++等不同類(lèi)型的源代碼、MEX文件、可獨(dú)立運(yùn)行的應(yīng)用程序文件或組件。MATLAB還為Java、.NET和Excel提供了單獨(dú)的Builder,可以實(shí)現(xiàn)M文件到Java類(lèi)、.NET組件和Exceladd-ins的轉(zhuǎn)換。8.1.1MATLAB外部接口簡(jiǎn)介2023/2/4機(jī)械工業(yè)出版社Page11MATLAB的Java接口MATLAB的Java接口是在MATLAB環(huán)境中運(yùn)行和使用Java程序所提供的函數(shù)庫(kù)。通過(guò)MATLAB接口,用戶(hù)可以在MATLAB中直接訪(fǎng)問(wèn)JavaAPI,在工作空間創(chuàng)建Java對(duì)象和調(diào)用Java對(duì)象方法。8.1.1MATLAB外部接口簡(jiǎn)介2023/2/4機(jī)械工業(yè)出版社Page12MATLAB的.NET接口MATLAB的.NET接口是新版本MATLAB中為實(shí)現(xiàn)MATLAB與.NET的交互而引入的接口函數(shù)。通過(guò)MATLAB的.NET接口,用戶(hù)可以在MATLAB工作空間中創(chuàng)建.NET類(lèi)實(shí)例,還可以通過(guò)類(lèi)成員與.NET應(yīng)用程序進(jìn)行交互。8.1.1MATLAB外部接口簡(jiǎn)介2023/2/4機(jī)械工業(yè)出版社Page13MATLAB的COM交互接口MATLAB既可以充當(dāng)COM客戶(hù),控制其它組件,也可以充當(dāng)自動(dòng)化服務(wù)器,被其它組件所控制。MATLAB支持四種不同的COM客戶(hù)/服務(wù)器設(shè)置方式:MATLAB客戶(hù)和進(jìn)程內(nèi)服務(wù)器、MATLAB客戶(hù)和進(jìn)程外服務(wù)器、客戶(hù)程序和MATLAB自動(dòng)化服務(wù)器以及客戶(hù)程序和MATLAB引擎服務(wù)器。8.1.1MATLAB外部接口簡(jiǎn)介2023/2/4機(jī)械工業(yè)出版社Page14MATLAB的WebServices接口WebServices是一種允許分布在不同區(qū)域、運(yùn)行不同操作系統(tǒng)和開(kāi)發(fā)環(huán)境的計(jì)算機(jī)相互間進(jìn)行通信的技術(shù)。利用WebServices,客戶(hù)端可以訪(fǎng)問(wèn)并執(zhí)行遠(yuǎn)程服務(wù)器上所提供的Web服務(wù)。MATLAB可以充當(dāng)WebServices的客戶(hù)端,通過(guò)MATLAB的WebServices接口對(duì)服務(wù)器提供的WebServices進(jìn)行訪(fǎng)問(wèn)。8.1.1MATLAB外部接口簡(jiǎn)介2023/2/4機(jī)械工業(yè)出版社Page15MATLAB的串行I/O接口串口是計(jì)算機(jī)同外部設(shè)備進(jìn)行通信的重要接口。通過(guò)MATLAB提供的串行I/O接口,用戶(hù)可以直接訪(fǎng)問(wèn)通過(guò)串口連接在計(jì)算機(jī)上的打印機(jī)、調(diào)制解調(diào)器等外部設(shè)備。該串行I/O接口建立在串行I/O對(duì)象之上,借助該對(duì)象所支持的函數(shù)和屬性,用戶(hù)可以配置串口通信、讀寫(xiě)數(shù)據(jù)并將信息記錄存盤(pán)。8.1.1MATLAB外部接口簡(jiǎn)介2023/2/4機(jī)械工業(yè)出版社Page16C/C++語(yǔ)言有著龐大的用戶(hù)群和強(qiáng)大的生命力,在當(dāng)前計(jì)算機(jī)軟件開(kāi)發(fā)中占據(jù)著相當(dāng)重要的位置。將MATLAB與C/C++相結(jié)合,可以發(fā)揮各自?xún)?yōu)勢(shì),縮短開(kāi)發(fā)周期,提高開(kāi)發(fā)效率。8.1.2常用MATLAB與C/C++混合編程方法2023/2/4機(jī)械工業(yè)出版社Page17使用MAT文件實(shí)現(xiàn)程序的數(shù)據(jù)交互;利用C/C++創(chuàng)建共享庫(kù)文件實(shí)現(xiàn)MATLAB對(duì)C/C++程序的調(diào)用;利用C/C++創(chuàng)建MEX文件實(shí)現(xiàn)MATLAB對(duì)C/C++程序的調(diào)用;利用MATLAB引擎實(shí)現(xiàn)C/C++對(duì)MATLAB的調(diào)用;利用MATLAB編譯器實(shí)現(xiàn)MATLAB與C/C++的混合編程;8.1.2常用MATLAB與C/C++混合編程方法2023/2/4機(jī)械工業(yè)出版社Page188.2使用MAT文件實(shí)現(xiàn)數(shù)據(jù)交互8.2.1MAT文件簡(jiǎn)介8.2.2操作MAT文件的API8.2.3編譯和鏈接MAT程序的配置8.2.4MAT文件實(shí)現(xiàn)數(shù)據(jù)交互實(shí)例2023/2/4機(jī)械工業(yè)出版社Page19MAT文件是MATLAB專(zhuān)用的數(shù)據(jù)存儲(chǔ)格式,也是其默認(rèn)的文件格式。MAT文件以.mat為后綴,文件中數(shù)據(jù)以二進(jìn)制格式保存,用戶(hù)一般只能在MATLAB載入MAT文件后,通過(guò)變量編輯器實(shí)現(xiàn)對(duì)MAT文件的修改。8.2.1MAT文件簡(jiǎn)介2023/2/4機(jī)械工業(yè)出版社Page20MAT文件由文件頭和緊隨其后的數(shù)據(jù)單位組成。MAT文件頭又可分為MATLAB的版本信息、操作平臺(tái)的信息和文件創(chuàng)建的時(shí)間共三部分。文件頭共128字節(jié),type命令可查看。8.2.1MAT文件簡(jiǎn)介2023/2/4機(jī)械工業(yè)出版社Page21為了簡(jiǎn)化在MATLAB之外的環(huán)境中使用MAT文件,MATLAB提供了一系列的API,用于實(shí)現(xiàn)MAT文件的讀寫(xiě)。利用API對(duì)MAT文件進(jìn)行讀寫(xiě),無(wú)需了解MAT文件的內(nèi)部格式,而且當(dāng)MATLAB升級(jí)時(shí),即使MAT文件的版本發(fā)生了改變也無(wú)需重寫(xiě)用戶(hù)代碼。MATLAB強(qiáng)烈建議用戶(hù)使用MATLAB提供的API實(shí)現(xiàn)MAT文件的讀寫(xiě)。8.2.2操作MAT文件的API函數(shù)2023/2/4機(jī)械工業(yè)出版社Page22操作MAT文件的API包括MAT文件函數(shù)庫(kù)和MX矩陣函數(shù)庫(kù)。MAT文件函數(shù)庫(kù)以mat為前綴,所有函數(shù)在頭文件mat.h中聲明,主要用于MAT文件的創(chuàng)建和讀寫(xiě)。MX矩陣函數(shù)庫(kù)以mx為前綴,所有函數(shù)在頭文件matrix.h中進(jìn)行聲明,主要用于矩陣元素的創(chuàng)建和操作。8.2.2操作MAT文件的API函數(shù)2023/2/4機(jī)械工業(yè)出版社Page238.2.2操作MAT文件的API函數(shù)函數(shù)說(shuō)
明matOpen打開(kāi)一個(gè)MAT文件matClose關(guān)閉一個(gè)MAT文件matGetDir獲取MAT文件中的MATLAB數(shù)組列表matGetFp獲取一個(gè)指向MAT文件的ANSIC文件指針matGetVariable從MAT文件中讀取一個(gè)MATLAB數(shù)組matPutVariable將一個(gè)MATLAB數(shù)組寫(xiě)入MAT文件matGetNextVariable從MAT文件中讀取下一個(gè)MATLAB數(shù)組matDeleteVariable將一個(gè)MATLAB數(shù)組從MAT文件中刪除matPutVariableAsGlobal將一個(gè)MATLAB數(shù)組作為全局變量寫(xiě)入MAT文件matGetVariableInfo從一個(gè)MAT文件中載入一個(gè)MATLAB數(shù)組頭matGetNextVariableInfo從一個(gè)MAT文件中載入下一個(gè)MATLAB數(shù)組頭2023/2/4機(jī)械工業(yè)出版社Page248.2.2操作MAT文件的API函數(shù)函數(shù)說(shuō)
明mxCreateLogicalArray創(chuàng)建一個(gè)N維的邏輯mxArray類(lèi)型的矩陣,初始化為falsemxCreateLogicalMatrix創(chuàng)建一個(gè)二維的邏輯mxArray類(lèi)型的矩陣,初始化為falsemxCreateDoubleMatrix創(chuàng)建一個(gè)二維的雙精度浮點(diǎn)mxArray矩陣,初始化為0mxCreateSparse創(chuàng)建一個(gè)二維的稀疏矩陣mxCreateString按指定的字符串創(chuàng)建一個(gè)字符串?dāng)?shù)組mxCreateCellMatrix創(chuàng)建一個(gè)二維的空數(shù)組,每個(gè)元素都為NULLmxCreateStructArray用指定的字段創(chuàng)建一個(gè)N維的結(jié)構(gòu)體數(shù)組,初始化為NULLmxDestroyArray釋放由mxCreate*函數(shù)所分配的動(dòng)態(tài)內(nèi)存2023/2/4機(jī)械工業(yè)出版社Page258.2.2操作MAT文件的API函數(shù)函數(shù)說(shuō)
明mxGetM獲取數(shù)組第一維元素的個(gè)數(shù)mxGetN獲取數(shù)組除第一維其它維上元素的個(gè)數(shù)(矩陣的列數(shù))mxGetDimensions獲取數(shù)組各維上元素的個(gè)數(shù)mxSetM設(shè)置mxArray類(lèi)型矩陣的行數(shù)mxSetN設(shè)置mxArray類(lèi)型矩陣的列數(shù)mxGetPr獲取double類(lèi)型數(shù)組的實(shí)部數(shù)據(jù)指針mxGetPi獲取double類(lèi)型數(shù)組的虛部數(shù)據(jù)指針mxSetPr為double類(lèi)型數(shù)組設(shè)置新的實(shí)部數(shù)據(jù)mxSetPi為double類(lèi)型數(shù)組設(shè)置新的虛部數(shù)據(jù)2023/2/4機(jī)械工業(yè)出版社Page26為了在C/C++開(kāi)發(fā)環(huán)境中編譯和鏈接調(diào)用MAT文件接口函數(shù)的程序,用戶(hù)必須進(jìn)行必要的環(huán)境設(shè)置。本小節(jié)介紹在MATLAB平臺(tái)利用mex命令和在VS2005開(kāi)發(fā)環(huán)境中編譯、鏈接MAT程序的環(huán)境配置。8.2.3編譯和鏈接MAT程序環(huán)境配置2023/2/4機(jī)械工業(yè)出版社Page27MATLAB平臺(tái)mex命令環(huán)境配置MATLAB借助mex命令和MAT屬性文件來(lái)實(shí)現(xiàn)C/C++MAT程序的編譯和鏈接。MAT屬性文件位于目錄【matlabroot\bin\win32\mexopts\】下,文件名為“*engmatopts.bat”,其中,*代表編譯器的類(lèi)型和版本號(hào)。8.2.3編譯和鏈接MAT程序環(huán)境配置2023/2/4機(jī)械工業(yè)出版社Page28MATLAB平臺(tái)mex命令環(huán)境配置假若當(dāng)前工作目錄下存在一個(gè)名為matcreat.c的C程序,利用微軟VisualC++Version8.0(VS2005)將其編譯為獨(dú)立的可執(zhí)行程序,則需要在MATLAB中輸入下面的命令行代碼:若當(dāng)前操作系統(tǒng)并未安裝VisualC++Version8.0,MATLAB會(huì)提示“無(wú)法定位編譯器”的錯(cuò)誤信息。8.2.3編譯和鏈接MAT程序環(huán)境配置mex-fmatlabroot\bin\win32\mexopts\msvc80engmatopts.batmatcreat.c2023/2/4機(jī)械工業(yè)出版社Page29MATLAB平臺(tái)mex命令環(huán)境配置在mex命令后加入-setup參數(shù)可查看當(dāng)前系統(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機(jī)械工業(yè)出版社Page30VS2005平臺(tái)開(kāi)發(fā)MAT程序環(huán)境配置利用mex命令可以實(shí)現(xiàn)C/C++程序的編譯鏈接,當(dāng)程序包含多個(gè)文件時(shí),用這種命令行方法編譯程序就不是很方便。VisualC++是Windows系統(tǒng)下最受歡迎的C/C++開(kāi)發(fā)環(huán)境,可以管理和開(kāi)發(fā)大規(guī)模的C/C++程序,下面介紹在VS2005下編譯、鏈接MAT程序的環(huán)境配置。8.2.3編譯和鏈接MAT程序環(huán)境配置2023/2/4機(jī)械工業(yè)出版社Page31VS2005平臺(tái)開(kāi)發(fā)MAT程序環(huán)境配置1.將【matlabroot\extern\include】加入為包含目錄(mat.h和matrix.h
所在目錄)8.2.3編譯和鏈接MAT程序環(huán)境配置2023/2/4機(jī)械工業(yè)出版社Page32VS2005平臺(tái)開(kāi)發(fā)MAT程序環(huán)境配置2.【matlabroot\extern\lib\win32\microsoft】設(shè)置為庫(kù)目錄(MAT接口和矩陣庫(kù)所在目錄)8.2.3編譯和鏈接MAT程序環(huán)境配置2023/2/4機(jī)械工業(yè)出版社Page33VS2005平臺(tái)開(kāi)發(fā)MAT程序環(huán)境配置3.工程屬性頁(yè)中加入對(duì)libmat.lib和libmx.lib兩個(gè)庫(kù)文件的鏈接8.2.3編譯和鏈接MAT程序環(huán)境配置2023/2/4機(jī)械工業(yè)出版社Page348.2.4MAT文件實(shí)現(xiàn)數(shù)據(jù)交互實(shí)例【例8-1】編寫(xiě)C程序,通過(guò)MATAPI創(chuàng)建一個(gè)MAT文件,并在MATLAB中查看創(chuàng)建的MAT文件的內(nèi)容。為簡(jiǎn)化代碼編寫(xiě)過(guò)程,我們以MATLAB自帶的示例代碼matcreat.c為基礎(chǔ)創(chuàng)建MAT文件,具體步驟如下:2023/2/4機(jī)械工業(yè)出版社Page35在VS2005中新建一個(gè)空的VisualC++Win32控制臺(tái)應(yīng)用程序,項(xiàng)目名稱(chēng)為“CreateMatFileTest”;將目錄【matlabroot\extern\examples\eng_mat\】下的matcreat.c拷貝到當(dāng)前項(xiàng)目目錄中,并通過(guò)【項(xiàng)目】菜單下的【添加現(xiàn)有項(xiàng)】子菜單將文件matcreat.c加入當(dāng)前工程。修改matcreat.c,保留程序創(chuàng)建MAT文件相關(guān)代碼8.2.4MAT文件實(shí)現(xiàn)數(shù)據(jù)交互實(shí)例2023/2/4機(jī)械工業(yè)出版社Page36為當(dāng)前項(xiàng)目加入依賴(lài)連接庫(kù)文件libmat.lib和libmx.lib;編譯、鏈接工程,并運(yùn)行程序;撰寫(xiě)MATLAB程序,讀取MAT文件內(nèi)容具體代碼參見(jiàn)光盤(pán)實(shí)例源碼。8.2.4MAT文件實(shí)現(xiàn)數(shù)據(jù)交互實(shí)例2023/2/4機(jī)械工業(yè)出版社Page378.2.4MAT文件實(shí)現(xiàn)數(shù)據(jù)交互實(shí)例2023/2/4機(jī)械工業(yè)出版社Page388.3使用共享庫(kù)實(shí)現(xiàn)混合編程8.3.1MATLAB調(diào)用共享庫(kù)函數(shù)8.3.2給共享庫(kù)中的函數(shù)傳遞參數(shù)8.3.3私用libpointer/libstruct對(duì)象8.3.4使用共享庫(kù)實(shí)現(xiàn)混合編程實(shí)例2023/2/4機(jī)械工業(yè)出版社Page39
共享庫(kù)是一組可以在程序運(yùn)行時(shí)動(dòng)態(tài)加載的函數(shù)的集合,在windows平臺(tái)中共享庫(kù)就是動(dòng)態(tài)連接庫(kù)(DLL)。在MATLAB中要訪(fǎng)問(wèn)共享庫(kù)中的函數(shù),首先必須載入共享庫(kù)。共享庫(kù)被載入后,利用MATLAB提供的查看列表命令可以查看共享庫(kù)中包含的函數(shù),在完成函數(shù)調(diào)用后,需要卸載共享庫(kù)。8.3.1MATLAB調(diào)用共享庫(kù)函數(shù)2023/2/4機(jī)械工業(yè)出版社Page40
共享庫(kù)是一組可以在程序運(yùn)行時(shí)動(dòng)態(tài)加載的函數(shù)的集合,在windows平臺(tái)中共享庫(kù)就是動(dòng)態(tài)連接庫(kù)(DLL)。在MATLAB中要訪(fǎng)問(wèn)共享庫(kù)中的函數(shù),首先必須載入共享庫(kù)。共享庫(kù)被載入后,利用MATLAB提供的查看列表命令可以查看共享庫(kù)中包含的函數(shù),在完成函數(shù)調(diào)用后,需要卸載共享庫(kù)。8.3.1MATLAB調(diào)用共享庫(kù)函數(shù)2023/2/4機(jī)械工業(yè)出版社Page41共享庫(kù)載入函數(shù)函數(shù)loadlibrary載入共享庫(kù),函數(shù)語(yǔ)法形式如下:loadlibrary('shrlib','hfile')shrlib是共享庫(kù)文件名稱(chēng);hfile是包含函數(shù)原型的頭文件的名稱(chēng)。如:hfile=[matlabroot'\extern\include\matrix.h']8.3.1MATLAB調(diào)用共享庫(kù)函數(shù)2023/2/4機(jī)械工業(yè)出版社Page42共享庫(kù)卸載函數(shù)函數(shù)unloadlibrary卸載共享庫(kù),函數(shù)語(yǔ)法形式如下:
unloadlibrary('libname')
unloadlibrary
libnamelibname:共享庫(kù)名。8.3.1MATLAB調(diào)用共享庫(kù)函數(shù)2023/2/4機(jī)械工業(yè)出版社Page43共享庫(kù)查看函數(shù)MATLAB提供了兩個(gè)查看函數(shù)。
libfunctions函數(shù)語(yǔ)法形式如下:m=libfunctions('libname')m=libfunctions('libname','-full')libname:共享庫(kù)名;'-full':表示顯示函數(shù)的詳細(xì)信息;m:返回值,是一個(gè)字符串型的單元陣列,包含函數(shù)信息。8.3.1MATLAB調(diào)用共享庫(kù)函數(shù)2023/2/4機(jī)械工業(yè)出版社Page44共享庫(kù)查看函數(shù)libfunctionsview函數(shù)語(yǔ)法形式如下:
libfunctionsview('libname')libfunctions在命令窗口中顯示共享庫(kù)中函數(shù)libfunctionsview在圖形用戶(hù)界面中顯示共享庫(kù)中函數(shù)。帶-full參數(shù)的函數(shù)返回共享庫(kù)中所有函數(shù)的完全描述。8.3.1MATLAB調(diào)用共享庫(kù)函數(shù)2023/2/4機(jī)械工業(yè)出版社Page45共享庫(kù)調(diào)用函數(shù)函數(shù)calllib調(diào)用共享庫(kù)中的函數(shù),函數(shù)語(yǔ)法形式如下:[x1,...,xN]=calllib('libname', 'funcname',arg1,…,argN)libname:調(diào)用函數(shù)所在共享庫(kù)的名稱(chēng);funcname:調(diào)用函數(shù)的名稱(chēng);arg1…argN:為函數(shù)傳入的參數(shù);x1…xN:函數(shù)返回值。8.3.1MATLAB調(diào)用共享庫(kù)函數(shù)2023/2/4機(jī)械工業(yè)出版社Page46C與MATLAB數(shù)據(jù)類(lèi)型對(duì)應(yīng)關(guān)系8.3.2給共享庫(kù)中的函數(shù)傳遞參數(shù)C語(yǔ)言數(shù)據(jù)類(lèi)型對(duì)應(yīng)MATLAB數(shù)據(jù)類(lèi)型char,byteint8unsignedchar,byteuint8shortint16unsignedshortuint16intint32long(32bit)int32long(64bit)int64unsignedint,unsignedlonguint32floatsingledoubledouble2023/2/4機(jī)械工業(yè)出版社Page47C與MATLAB數(shù)據(jù)類(lèi)型對(duì)應(yīng)關(guān)系(續(xù))8.3.2給共享庫(kù)中的函數(shù)傳遞參數(shù)C語(yǔ)言數(shù)據(jù)類(lèi)型對(duì)應(yīng)MATLAB數(shù)據(jù)類(lèi)型char*cstring(1×n字符數(shù)組)*char[]字符串單元數(shù)組int*(u)int(size)Ptr字符串cstring字符串引用stringPtr字符串指針數(shù)組stringPtrPtr有符號(hào)字節(jié)矩陣int8Ptrfloat*singlePtrdouble*doublePtrmxArray*MATLABarrayvoid*voidPtrvoid**voidPtrPtrtype**typePtrPtr2023/2/4機(jī)械工業(yè)出版社Page48參數(shù)傳遞原則非標(biāo)量數(shù)據(jù)類(lèi)型的函數(shù)參數(shù)必須聲明為引用調(diào)用(passbyreference);當(dāng)函數(shù)參數(shù)為二維矩陣時(shí),需要將輸入矩陣轉(zhuǎn)置后再傳給處理函數(shù),對(duì)函數(shù)的返回結(jié)果也要做轉(zhuǎn)置處理。這是因?yàn)镃語(yǔ)言與MATLAB矩陣元素的單下標(biāo)索引順序不同,前者是行優(yōu)先,而后者是列優(yōu)先;8.3.2給共享庫(kù)中的函數(shù)傳遞參數(shù)2023/2/4機(jī)械工業(yè)出版社Page49參數(shù)傳遞原則(續(xù))當(dāng)函數(shù)參數(shù)是數(shù)組類(lèi)型,并且數(shù)組維數(shù)在二維以上時(shí),為保持?jǐn)?shù)組形狀,需要在調(diào)用函數(shù)之前備份數(shù)組形狀信息,這樣在函數(shù)調(diào)用后就可以利用備份的數(shù)組形狀信息恢復(fù)數(shù)組原來(lái)的形狀;當(dāng)函數(shù)參數(shù)為指針類(lèi)型時(shí),用空數(shù)組[]來(lái)傳遞一個(gè)NULL參數(shù)值。8.3.2給共享庫(kù)中的函數(shù)傳遞參數(shù)2023/2/4機(jī)械工業(yè)出版社Page50傳遞原生類(lèi)型參數(shù)當(dāng)需要傳遞的函數(shù)參數(shù)為MATLAB原生數(shù)據(jù)類(lèi)型時(shí),MATLAB自動(dòng)將MATLAB中的數(shù)據(jù)轉(zhuǎn)換為外部函數(shù)參數(shù)所需的數(shù)據(jù)類(lèi)型。例如,外部函數(shù)輸入?yún)?shù)為short類(lèi)型,用戶(hù)可以將double類(lèi)型的數(shù)據(jù)作為輸入?yún)?shù)傳入,MATLAB會(huì)自動(dòng)將double類(lèi)型數(shù)據(jù)轉(zhuǎn)換為外部函數(shù)所需的short類(lèi)型參數(shù)。8.3.2給共享庫(kù)中的函數(shù)傳遞參數(shù)2023/2/4機(jī)械工業(yè)出版社Page51傳遞字符串參數(shù)當(dāng)外部共享庫(kù)函數(shù)包含char*型參數(shù)時(shí),可以將MATLAB字符串作為參數(shù)傳入,即MATLAB中的字符串等同于C語(yǔ)言中的char*。即:MATLAB中的cstring變量與共享庫(kù)函數(shù)中的char*變量相對(duì)應(yīng)。8.3.2給共享庫(kù)中的函數(shù)傳遞參數(shù)2023/2/4機(jī)械工業(yè)出版社Page52傳遞指針參數(shù)若共享庫(kù)中函數(shù)的參數(shù)為引用型參數(shù)(指針或引用),傳入對(duì)應(yīng)的數(shù)值型參數(shù)即可,MATLAB會(huì)自動(dòng)將傳入的數(shù)值型參數(shù)轉(zhuǎn)換為對(duì)應(yīng)的引用型參數(shù)。
如:8.3.2給共享庫(kù)中的函數(shù)傳遞參數(shù)doubleaddDoubloeByRef(doublex,double*y);calllib(‘libname’,‘a(chǎn)ddDoubleByRef’,1.5,2,6)2023/2/4機(jī)械工業(yè)出版社Page53很多時(shí)候,需要傳入引用型參數(shù)而不能傳入數(shù)值型參數(shù)。如想對(duì)輸入?yún)?shù)的值進(jìn)行更改或傳入的數(shù)據(jù)占用很多的存儲(chǔ)空間時(shí),就需要使用引用型參數(shù)。針對(duì)上述情況,MATLAB為用戶(hù)提供了libpointer對(duì)象和libstruct對(duì)象。8.3.3使用libpointer/libstruct對(duì)象傳遞參數(shù)2023/2/4機(jī)械工業(yè)出版社Page54創(chuàng)建libpointer對(duì)象libpointer函數(shù)用來(lái)創(chuàng)建libpointer對(duì)象,函數(shù)語(yǔ)法形式如下:p=libpointer('type','value')type:創(chuàng)建指針?biāo)赶虻臄?shù)據(jù)類(lèi)型,如int32Ptr等;value:為指針對(duì)象賦予的初始值;p:返回的指針對(duì)象。8.3.3使用libpointer/libstruct對(duì)象傳遞參數(shù)2023/2/4機(jī)械工業(yè)出版社Page55創(chuàng)建指向原生數(shù)據(jù)類(lèi)型變量的指針假如存在double型變量x,現(xiàn)在需要?jiǎng)?chuàng)建一個(gè)指向x的libpointer對(duì)象,代碼如下:8.3.3使用libpointer/libstruct對(duì)象傳遞參數(shù)>>x=10;>>xp=libpointer('doublePtr',x);>>get(xp)Value:10
DataType:'doublePtr'xp即是我們創(chuàng)建的指向變量x的double類(lèi)型libpointer對(duì)象。2023/2/4機(jī)械工業(yè)出版社Page56通過(guò)既有l(wèi)ibpointer創(chuàng)建指針在已有l(wèi)ibpointer對(duì)象的基礎(chǔ)上,利用加號(hào)運(yùn)算符(+)用戶(hù)很容易創(chuàng)建新的libpointer對(duì)象。創(chuàng)建新指針的過(guò)程與C語(yǔ)言中利用偏移創(chuàng)建新指針類(lèi)似。8.3.3使用libpointer/libstruct對(duì)象傳遞參數(shù)>>x=1:8;>>xp=libpointer('doublePtr',x);>>xp2=xp+3;>>xp2.Valueans=456782023/2/4機(jī)械工業(yè)出版社Page57MEX文件是用C/C++或Fortran編寫(xiě),遵循MEX文件格式的,可被MATLAB直接調(diào)用的一種文件。MATLA將MEX文件中的函數(shù)視為它的內(nèi)建函數(shù),MATLAB解釋器可以自動(dòng)載入并執(zhí)行它們。MEX文件有二進(jìn)制MEX文件和MEX源文件之分,一般情況下指的是二進(jìn)制MEX文件。8.4.1MEX文件簡(jiǎn)介2023/2/4機(jī)械工業(yè)出版社Page58利用libpointer創(chuàng)建指向結(jié)構(gòu)體的指針當(dāng)函數(shù)的參數(shù)為結(jié)構(gòu)體類(lèi)型時(shí),傳入的參數(shù)可以是結(jié)構(gòu)體也是以是指向結(jié)構(gòu)體的指針。8.3.3使用libpointer/libstruct對(duì)象傳遞參數(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機(jī)械工業(yè)出版社Page59利用libstruct創(chuàng)建指向結(jié)構(gòu)體的指針libstruct函數(shù)也可用于創(chuàng)建結(jié)構(gòu)體對(duì)象,libstruct語(yǔ)法形式如下:
s=libstruct('structtype',mlstruct)'structtype':指定所創(chuàng)建對(duì)象的結(jié)構(gòu)體類(lèi)型mlstruct:為所創(chuàng)建結(jié)構(gòu)體對(duì)象賦予的初值s:返回所創(chuàng)建的libstruct對(duì)象。8.3.3使用libpointer/libstruct對(duì)象傳遞參數(shù)根據(jù)C語(yǔ)言中的結(jié)構(gòu)體類(lèi)型structtype來(lái)創(chuàng)建libstruct對(duì)象,并根據(jù)mlstruct為對(duì)象的域賦初值。2023/2/4機(jī)械工業(yè)出版社Page608.3.4使用共享庫(kù)實(shí)現(xiàn)混合編程實(shí)例【例8-2】已知共享庫(kù)libname中包含函數(shù)addDoubleByRef和addStructByRef,定義如下頁(yè),編寫(xiě)MATLAB程序,利用libpointer對(duì)象和libstruct對(duì)象傳遞參數(shù)調(diào)用函數(shù)。(假定libname共享庫(kù)的頭文件為libname.h)2023/2/4機(jī)械工業(yè)出版社Page618.3.4使用共享庫(kù)實(shí)現(xiàn)混合編程實(shí)例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機(jī)械工業(yè)出版社Page62loadlibrary('libname','libname.h')
%裝載libname共享庫(kù)x=1.2;%創(chuàng)建doublePtr類(lèi)型libpointer對(duì)象yp=libpointer('doublePtr',x);
%調(diào)用函數(shù)addDoubleByRefcalllib('libname','addDoubleByRef',2.3,yp);
%創(chuàng)建結(jié)構(gòu)體對(duì)象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)體對(duì)象calllib(‘libname’,‘a(chǎn)ddStructByRef’,sp)
%傳入libpointer對(duì)象%利用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共享庫(kù)2023/2/4機(jī)械工業(yè)出版社Page638.4使用MEX文件實(shí)現(xiàn)混合編程8.4.1MEX文件簡(jiǎn)介8.4.2使用MEX文件環(huán)境配置8.4.3C語(yǔ)言MEX函數(shù)8.4.4C語(yǔ)言創(chuàng)建MEX文件實(shí)例8.4.5C++語(yǔ)言創(chuàng)建MEX文件實(shí)例2023/2/4機(jī)械工業(yè)出版社Page64MEX文件是用C/C++或Fortran編寫(xiě),遵循MEX文件格式的,可被MATLAB直接調(diào)用的一種文件。MATLA將MEX文件中的函數(shù)視為它的內(nèi)建函數(shù),MATLAB解釋器可以自動(dòng)載入并執(zhí)行它們。MEX文件有二進(jìn)制MEX文件和MEX源文件之分,一般情況下指的是二進(jìn)制MEX文件。8.4.1MEX文件簡(jiǎn)介2023/2/4機(jī)械工業(yè)出版社Page65MEX文件用途可以直接調(diào)用已有的大量C/C++或者Fortran程序,而無(wú)需將他們用MATLAB重新改寫(xiě);用C/C++或者Frotran語(yǔ)言編寫(xiě)那些在MATLAB中運(yùn)算速度過(guò)慢的算法以提高效率,如包含大量的逐元素處理的循環(huán)運(yùn)算等直接控制硬件,如A/D采集卡,D/A輸出卡等,以用于數(shù)據(jù)采集或控制應(yīng)用。8.4.1MEX文件簡(jiǎn)介2023/2/4機(jī)械工業(yè)出版社Page66MEX源文件結(jié)構(gòu)MEX源文件是指用C/C++或Fortan語(yǔ)言所編寫(xiě)的遵循MEX文件格式的源代碼文件。C語(yǔ)言MEX源文件由三部分組成:第一部分:頭文件包含及宏定義;第二部分:計(jì)算例程,即在MEX源文件中完成計(jì)算功能的程序代碼,計(jì)算程序可以是普通的C/C++程序,按照C/C++語(yǔ)言規(guī)則編寫(xiě)即可;第三部分:入口例程,即將計(jì)算例程與MATLAB連接的入口函數(shù)mexFunction。8.4.1MEX文件簡(jiǎn)介2023/2/4機(jī)械工業(yè)出版社Page67MEX源文件結(jié)構(gòu)-mexFunction聲明8.4.1MEX文件簡(jiǎn)介voidmexFunction(
int
nlhs, /*期望輸出參數(shù)個(gè)數(shù)*/
mxArray*plhs[], /*指向輸出參數(shù)的指針數(shù)組*/
int
nrhs, /*期望的輸入?yún)?shù)個(gè)數(shù)*/constmxArray*prhs[] /*執(zhí)行輸入?yún)?shù)的指針數(shù)組*/)nlhs:輸出數(shù)據(jù)的個(gè)數(shù);plhs:指向mxArray類(lèi)型輸出數(shù)據(jù)的指針;nrhs:輸入數(shù)據(jù)的個(gè)數(shù);prhs:指向mxArray類(lèi)型輸入數(shù)據(jù)的指針。2023/2/4機(jī)械工業(yè)出版社Page68二進(jìn)制MEX文件二進(jìn)制MEX文件是程序運(yùn)行時(shí)動(dòng)態(tài)加載的一種共享庫(kù)。二進(jìn)制MEX文件有自己的平臺(tái)無(wú)關(guān)的后綴,用mex命令創(chuàng)建二進(jìn)制MEX文件時(shí)該后綴會(huì)自動(dòng)生成。在32位Windows平臺(tái)中,二進(jìn)制MEX文件的后綴是.mexw32,在64位Windows平臺(tái)中,其后綴為.mexw64。未來(lái)版本本,dll后綴MEX文件不再支持。8.4.1MEX文件簡(jiǎn)介2023/2/4機(jī)械工業(yè)出版社Page69在8.2.3中,已經(jīng)對(duì)mex命令的環(huán)境配置做過(guò)初步介紹,這里基于WindowsXP操作系統(tǒng)和MATLAB2010a,詳細(xì)介紹mex命令的環(huán)境配置。8.4.2使用MEX文件的環(huán)境配置
在MATLAB命令提示符下,輸入mex配置命令,顯示如下信息:>>mex-setupPleasechooseyourcompilerforbuildingexternalinterface(MEX)files:Wouldyoulikemextolocateinstalledcompilers[y]/n?2023/2/4機(jī)械工業(yè)出版社Page70選擇“y”,mex命令會(huì)列出找到的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機(jī)械工業(yè)出版社Page71選擇[1]-[3]中的任一項(xiàng),mex命令將給出提示信息:8.4.2使用MEX文件的環(huán)境配置Compiler:MicrosoftVisualC++2005SP1Location:C:\ProgramFiles\MicrosoftVisualStudio8
Arethesecorrect[y]/n?2023/2/4機(jī)械工業(yè)出版社Page72確認(rèn)所選擇編譯器及安裝路徑正確無(wú)誤后,選擇“y”,mex命令將對(duì)系統(tǒng)進(jìn)行配置,若成功將給出如下提示: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機(jī)械工業(yè)出版社Page73MEX編譯選項(xiàng)設(shè)置mex命令要借助編譯選項(xiàng)來(lái)實(shí)現(xiàn)MEX文件的編譯。mex命令的語(yǔ)法形式為:
mexfilename-foptionsfile-f參數(shù)指明使用選項(xiàng)文件optionsfile來(lái)編譯MEX文件;當(dāng)mex命令不指定選項(xiàng)文件時(shí),MATLAB使用默認(rèn)的選項(xiàng)文件。8.4.2使用MEX文件的環(huán)境配置2023/2/4機(jī)械工業(yè)出版社Page74戶(hù)也可以利用VS2005平臺(tái)創(chuàng)建MEX文件。用C/C++語(yǔ)言開(kāi)發(fā)MEX程序,一般要調(diào)用MEX函數(shù)庫(kù)(libmex.dll)和矩陣函數(shù)庫(kù)(libmx.dll),要實(shí)現(xiàn)MEX程序的正確編譯,用戶(hù)必須首先對(duì)VS2005的包含文件目錄和庫(kù)文件目錄進(jìn)行配置,然后加入相應(yīng)庫(kù)文件的鏈接即可。8.4.2使用MEX文件的環(huán)境配置2023/2/4機(jī)械工業(yè)出版社Page75
MEX函數(shù)庫(kù)是MATLAB外部程序接口函數(shù)庫(kù)提供的一系列函數(shù),它們均以mex為前綴,主要實(shí)現(xiàn)與MATLAB環(huán)境的交互。下頁(yè)表中列出了MATLABC語(yǔ)言MEX函數(shù)庫(kù)提供的接口函數(shù)及其功能介紹。8.4.3C語(yǔ)言MEX函數(shù)2023/2/4機(jī)械工業(yè)出版社Page76函數(shù)功能介紹mexAtExit登記一個(gè)函數(shù),該函數(shù)在MEX文件被清除或者M(jìn)ATLAB終止執(zhí)行時(shí)被調(diào)用,用來(lái)完成釋放內(nèi)存等善后工作mexCallMATLAB調(diào)用MATLAB自建函數(shù)、用戶(hù)自定義函數(shù)或MEX文件mexCallMATLABWithTrap調(diào)用MATLAB自建函數(shù)、用戶(hù)自定義函數(shù)或MEX文件,并捕獲函數(shù)運(yùn)行的錯(cuò)誤信息mexErrMsgIdAndTxt輸出帶標(biāo)識(shí)符的錯(cuò)誤信息,并返回到MATLAB命令提示符下mexErrMsgTxt輸出錯(cuò)誤信息,并返回到MATLAB命令提示符下mexEvalString在調(diào)用者工作空間執(zhí)行MATLAB命令mexEvalStringWithTrap在調(diào)用者工作空間執(zhí)行MATLAB命令,并捕獲函數(shù)運(yùn)行的錯(cuò)誤信息mexFunctionC/C++和Fortran語(yǔ)言MEX文件的入口點(diǎn)函數(shù)mexFunctionName獲取當(dāng)前執(zhí)行MEX文件的文件名mexGet獲取某一指定圖像句柄的屬性2023/2/4機(jī)械工業(yè)出版社Page77函數(shù)功能介紹mexGetVariable獲取特定工作空間中變量的拷貝mexGetVariablePtr獲取另一個(gè)工作空間中變量的只讀指針mexIsGlobal判斷mxArray變量是否具有作用域mexIsLocked判斷MEX文件是否處于鎖定狀態(tài)mexLock鎖定一個(gè)MEX文件mexMakeArrayPersistent將一個(gè)mxArray變量轉(zhuǎn)換為持久陣列對(duì)象mexMakeMemoryPersistent將MATLAB程序內(nèi)存轉(zhuǎn)換為持久陣列對(duì)象mexPrint與C語(yǔ)言的輸出函數(shù)Printf的輸出功能相同mexPutVariable將mxArray變量從MEX函數(shù)中復(fù)制到指定工作空間mexSet用于設(shè)定某個(gè)圖形句柄對(duì)象的屬性值mexSetTrapFlag控制mexCallMATLAB函數(shù)對(duì)錯(cuò)誤處理的響應(yīng)mexUnlock解鎖MEX文件,將MEX文件從內(nèi)存中清除mexWarnMsgIdAndTxt輸出帶標(biāo)識(shí)符的警告信息mexWarnMsgTxt輸出警告信息2023/2/4機(jī)械工業(yè)出版社Page788.4.4C語(yǔ)言創(chuàng)建MEX文件實(shí)例【例8-3】利用C語(yǔ)言創(chuàng)建MEX文件示例:編寫(xiě)C程序?qū)崿F(xiàn)標(biāo)量與數(shù)組相乘實(shí)例源碼見(jiàn)文件arrayProduct.c,該文件包括三個(gè)部分:第一部分:包含MEX函數(shù)庫(kù)頭文件第二部分:計(jì)算例程第三部分:入口例程函數(shù)2023/2/4機(jī)械工業(yè)出版社Page798.4.4C語(yǔ)言創(chuàng)建MEX文件實(shí)例/*第一部分:包含MEX函數(shù)庫(kù)頭文件*/#include"mex.h“/*第二部分:計(jì)算例程*/voidarrayProduct(doublex,double*y,double*z,
mwSizen){
mwSizei;/*multiplyeachelementybyx*/for(i=0;i<n;i++){
z[i]=x*y[i];}}2023/2/4機(jī)械工業(yè)出版社Page808.4.4C語(yǔ)言創(chuàng)建MEX文件實(shí)例/*第三部分:入口例程函數(shù)*/voidmexFunction(int
nlhs,mxArray*plhs[],
int
nrhs,constmxArray*prhs[]){doublemultiplier;/*inputscalar*/double*inMatrix;/*1xNinputmatrix*/
mwSize
ncols;/*sizeofmatrix*/double*outMatrix;/*outputmatrix*/
/*檢查輸入輸出參數(shù)個(gè)數(shù)是否正確*/
if(nrhs!=2){}
if(nlhs!=1){}/*確認(rèn)第一個(gè)輸入?yún)?shù)為標(biāo)量*/if(!mxIsDouble(prhs[0])||mxIsComplex(prhs[0])||mxGetNumberOfElements(prhs[0])!=1){}2023/2/4機(jī)械工業(yè)出版社Page818.4.4C語(yǔ)言創(chuàng)建MEX文件實(shí)例/*確認(rèn)第二個(gè)輸入?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)用計(jì)算例程*/
arrayProduct(multiplier,inMatrix,outMatrix,ncols);}2023/2/4機(jī)械工業(yè)出版社Page828.4.4C語(yǔ)言創(chuàng)建MEX文件實(shí)例利用mex命令或VS2005編譯文件arrayProduct.c,生成MEX文件arrayProduct.mexw32,在MATLAB中調(diào)用arrayProduct函數(shù),結(jié)果如下:>>A=arrayProduct(2,[1:4])A=24682023/2/4機(jī)械工業(yè)出版社Page838.4.5C++語(yǔ)言創(chuàng)建MEX文件實(shí)例【例8-4】用C++語(yǔ)言創(chuàng)建MEX文件示例:定義一個(gè)類(lèi)MyData,創(chuàng)建該類(lèi)的實(shí)例對(duì)象,并為對(duì)象賦值,顯示對(duì)象賦值前后的內(nèi)容。實(shí)例源碼請(qǐng)參見(jiàn)光盤(pán):例8-4目錄下的mexcpp.cpp文件。2023/2/4機(jī)械工業(yè)出版社Page848.4.5C++語(yǔ)言創(chuàng)建MEX文件實(shí)例C++語(yǔ)言MEX源文件結(jié)構(gòu)與例8-3中的C語(yǔ)言MEX源文件結(jié)構(gòu)類(lèi)似,同樣也包含三個(gè)主要部分:頭文件包含部分、計(jì)算例程和入口例程;不同的是,C++語(yǔ)言撰寫(xiě)的MEX源文件中增加了類(lèi)的定義,并在計(jì)算例程中創(chuàng)建類(lèi)的對(duì)象,并調(diào)用對(duì)象的函數(shù),在對(duì)象使用完畢需要釋放對(duì)象。2023/2/4機(jī)械工業(yè)出版社Page858.4.5C++語(yǔ)言創(chuàng)建MEX文件實(shí)例利用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機(jī)械工業(yè)出版社Page868.5使用MATLAB引擎實(shí)現(xiàn)混合編程8.5.1MATLAB引擎簡(jiǎn)介8.5.2MATLAB引擎函數(shù)8.5.3MATLAB引擎的使用8.5.4VS2005開(kāi)發(fā)MATLAB引擎實(shí)例2023/2/4機(jī)械工業(yè)出版社Page87MATLAB引擎是MATLAB提供的一組外部接口函數(shù)。通過(guò)這些接口函數(shù),用戶(hù)可以在C和Fortran等高級(jí)編程語(yǔ)言中實(shí)現(xiàn)對(duì)MATLAB的控制,將MATLAB作為一種計(jì)算引擎使用。8.5.1MATLAB引擎簡(jiǎn)介2023/2/4機(jī)械工業(yè)出版社Page88MATLAB引擎程序采用C、C++或Fortran語(yǔ)言編寫(xiě),通過(guò)引擎接口與MATLAB進(jìn)行交互。在UNIX系統(tǒng)中,引擎程序通過(guò)通道來(lái)和一個(gè)獨(dú)立的MATLAB進(jìn)程通信,在Windows系統(tǒng)中,則是通過(guò)組件對(duì)象模型(COM)接口來(lái)與MATLAB進(jìn)行交互。8.5.1MATLAB引擎簡(jiǎn)介2023/2/4機(jī)械工業(yè)出版社Page89借助MATLAB引擎,用戶(hù)可以實(shí)現(xiàn):在C/C++中調(diào)用MATLAB的數(shù)學(xué)函數(shù)或子程序來(lái)完成數(shù)據(jù)的處理。在C/C++中調(diào)用MATLAB來(lái)構(gòu)建針對(duì)某個(gè)特殊任務(wù)的整個(gè)系統(tǒng)。將MATLAB部署在計(jì)算能力更強(qiáng)的計(jì)算機(jī)上,通過(guò)網(wǎng)絡(luò)運(yùn)行MATLAB引擎實(shí)現(xiàn)資源的充分利用。8.5.1MATLAB引擎簡(jiǎn)介2023/2/4機(jī)械工業(yè)出版社Page90MATLAB引擎庫(kù)包含一系列從外部應(yīng)用程序調(diào)用和控制MATLAB引擎的函數(shù)。這些函數(shù)以eng為前綴,其C語(yǔ)言接口函數(shù)聲明都包含在頭文件engine.h中。下頁(yè)表中列出了MATLAB引擎接口函數(shù)及其功能介紹。8.5.2MATLAB引擎函數(shù)2023/2/4機(jī)械工業(yè)出版社Page918.5.2MATLAB引擎函數(shù)函數(shù)功能介紹engOpen啟動(dòng)MATLAB計(jì)算引擎engClose關(guān)閉MATLAB引擎engGetVariable從MATLAB工作空間獲得一個(gè)MATLAB數(shù)組engPutVariable將指定名稱(chēng)的MATLAB數(shù)組存入MATLAB工作空間engEvalString執(zhí)行一個(gè)MATLAB命令engOutputBuffer創(chuàng)建字符緩沖區(qū),以獲取MATLAB文本輸出engOpenSingleUse打開(kāi)一個(gè)單獨(dú)的非共享的MATLAB計(jì)算引擎engGetVisible返回MATLAB引擎顯示狀態(tài)engSetVisible設(shè)置MATLAB引擎的顯示或隱藏狀態(tài)2023/2/4機(jī)械工業(yè)出版社Page92在外部程序中調(diào)用MATLAB引擎,大致包含如下幾個(gè)步驟:打開(kāi)MATALAB引擎;將輸入數(shù)據(jù)轉(zhuǎn)換成MATLAB引擎空間中使用的形式;將上一步轉(zhuǎn)換得到的數(shù)據(jù)放入MATLAB計(jì)算引擎的工作空間;8.5.3MATLAB引擎的使用2023/2/4機(jī)械工業(yè)出版社Page93調(diào)用函數(shù)engEvalString向MATLAB引擎發(fā)送命令字符串,執(zhí)行MATLAB操作或運(yùn)算;從預(yù)先定義的緩沖區(qū)獲取MATLAB引擎的輸出結(jié)果;關(guān)閉引擎,釋放內(nèi)存空間。8.5.3MATLAB引擎的使用2023/2/4機(jī)械工業(yè)出版社Page948.5.3MATLAB引擎的使用【例8-5】C語(yǔ)言調(diào)用MATLAB引擎示例。編寫(xiě)C程序,給定時(shí)間數(shù)組T,利用MATLAB引擎計(jì)算距離為時(shí)間的函數(shù)D=.5.*(-9.8).*T.^2;"),并調(diào)用MATLAB繪圖函數(shù)plot繪制二維曲線(xiàn),最后將計(jì)算結(jié)果打印到控制臺(tái)中。一維時(shí)間數(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機(jī)械工業(yè)出版社Page958.5.3MATLAB引擎的使用源碼engdemo.c包括六個(gè)步驟:步驟一:開(kāi)啟MATLAB引擎;步驟二:創(chuàng)建mxArray類(lèi)型變量T,并將C語(yǔ)言數(shù)組time中數(shù)據(jù)拷貝到T中;步驟三:將變量T載入MATLAB工作空間步驟四:向MATLAB引擎?zhèn)鬟f命令,計(jì)算距離為時(shí)間的函數(shù)并繪制結(jié)果;步驟五:獲取計(jì)算結(jié)果;步驟六:釋放內(nèi)存空間,關(guān)閉引擎2023/2/4機(jī)械工業(yè)出版社Page96VS2005是Windows平臺(tái)下非常出色的C/C++開(kāi)發(fā)工具,本小節(jié)介紹如何在VS2005中開(kāi)發(fā)MATLAB引擎程序。8.5.4VS2005開(kāi)發(fā)引擎程序?qū)嵗?023/2/4機(jī)械工業(yè)出版社Page97VS2005環(huán)境配置
將目錄【matlabroot\extern\include】配置為VS2005的包含文件目錄;【matlabroot\extern\lib\win32\microsoft】配置為VS2005的庫(kù)文件目錄;將MEX函數(shù)庫(kù)(libmex.dll)和矩陣函數(shù)庫(kù)(libmx.dll)加為工程的鏈接文件。
具體步驟可參考節(jié)8.2.3。8.5.4VS2005開(kāi)發(fā)引擎程序?qū)嵗?023/2/4機(jī)械工業(yè)出版社Page98VS2005平臺(tái)開(kāi)發(fā)MATLAB引擎程序新建一個(gè)空的Win32控制臺(tái)應(yīng)用程序項(xiàng)目;8.5.4VS2005開(kāi)發(fā)引擎程序?qū)嵗?023/2/4機(jī)械工業(yè)出版社Page99VS2005平臺(tái)開(kāi)發(fā)MATLAB引擎程序?qū)⒗?-5中的源代碼engdemo.c拷貝至項(xiàng)目engdemo工作目錄下,并添加至當(dāng)前工程;按照前面講述的連接庫(kù)導(dǎo)入方式在項(xiàng)目配置屬性中導(dǎo)入libmex.lib、libmx.lib和libeng.lib三個(gè)庫(kù)文件;編譯運(yùn)行程序。程序運(yùn)行結(jié)果如下兩頁(yè)圖所示。8.5.4VS2005開(kāi)發(fā)引擎程序?qū)嵗?023/2/4機(jī)械工業(yè)出版社Page1008.5.4VS2005開(kāi)發(fā)引擎程序?qū)嵗?023/2/4機(jī)械工業(yè)出版社Page1018.5.4VS2005開(kāi)發(fā)引擎程序?qū)嵗?023/2/4機(jī)械工業(yè)出版社Page1028.6使用MATLAB編譯器實(shí)現(xiàn)混合編程8.6.1MATLAB編譯器簡(jiǎn)介8.6.2編譯器的安裝與配置8.6.3編譯和部署MATLAB程序8.6.4使用編譯器混合編程實(shí)例2023/2/4機(jī)械工業(yè)出版社Page103MATLAB編譯器是MATLAB環(huán)境下的編譯工具。它能將M文件轉(zhuǎn)換成C/C++等不同類(lèi)型的源代碼,并在此基礎(chǔ)上根據(jù)需要生成MEX文件或可獨(dú)立運(yùn)行的應(yīng)用程序文件,從而大大提供代碼的執(zhí)行效率。與前面介紹的MATLAB引擎和MEX文件相比,有著更高的執(zhí)行效率和更廣泛的應(yīng)用范圍。8.6.1MATLAB編譯器簡(jiǎn)介2023/2/4機(jī)械工業(yè)出版社Page104MATLAB編譯器的使用
MATLAB編譯器利用mcc命令將M文件轉(zhuǎn)換為C/C++文件,同時(shí)生成一個(gè)相應(yīng)的包裹文件。該包裹文件包含編譯器產(chǎn)生的代碼和它所支持的可執(zhí)行文件類(lèi)型之間所必須的接口。利用該包裹文件提供的接口,生成的C/C++文件可用于創(chuàng)建C/C++編譯器所支持的多種類(lèi)型可執(zhí)行文件。8.6.1MATLAB編譯器簡(jiǎn)介2023/2/4機(jī)械工業(yè)出版社Page105MATLAB編譯器的使用
mcc命令的語(yǔ)法形式如下: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編譯器簡(jiǎn)介2023/2/4機(jī)械工業(yè)出版社Page106MATLAB編譯器的使用
常用的options參數(shù)包括:-m:生成可獨(dú)立運(yùn)行應(yīng)用程序,等同于–Wmain–Tlink:exe;-l:生成函數(shù)庫(kù),等同于–Wlib–Tlink:lib;-I:指定新的包含目錄;-g:編譯時(shí)生成調(diào)式信息;-d:指定輸出目錄。8.6.1MATLAB編譯器簡(jiǎn)介2023/2/4機(jī)械工業(yè)出版社Page107MATLAB編譯器的使用
常用的options參數(shù)包括:-T<option>:指定編譯步驟和目標(biāo)文件類(lèi),option可以是codegen、compile:exe、compile:lib、link:exe或link:lib;-W<option>:指定生成包裹函數(shù)的類(lèi)型,option可以是main、lib:<string>、cpplib:<string>或non。8.6.1MATLAB編譯器簡(jiǎn)介2023/2/4機(jī)械工業(yè)出版社Page108MATLAB編譯器的使用
mcc命令常見(jiàn)的幾種使用方式:-mcc–mmfile1mfile2mcc–m–Iincludepath–doutputpath
mfilemcc–lmfilemcc–Wlib:libname–Tlink:libmfile1mfile28.6.1MATLAB編譯器簡(jiǎn)介除mcc命令外,MATLAB還為用戶(hù)提供了圖形化的編譯、部署工具DeploymentTool,其使用在第9章中介紹。2023/2/4機(jī)械工業(yè)出版社Page109編譯M文件的原因可以獲得更快的運(yùn)行速度;可以實(shí)現(xiàn)算法的隱藏;能夠縮短項(xiàng)目開(kāi)發(fā)周期;無(wú)需MATLAB計(jì)算環(huán)境的支持就可創(chuàng)建可獨(dú)立運(yùn)行的應(yīng)用程序和共享庫(kù)。8.6.1MATLAB編譯器簡(jiǎn)介2023/2/4機(jī)械工業(yè)出版社Page110MATLAB編譯器的局限不能編譯腳本M文件;不能編譯使用對(duì)象的M文件;不用編譯使用input和eval語(yǔ)句操作工作空間變量的M文件;不能編譯動(dòng)態(tài)命名;不講編譯MATLAB內(nèi)建函數(shù)。8.6.1MATLAB編譯器簡(jiǎn)介2023/2/4機(jī)械工業(yè)出版社Page111在使用MATLAB編譯器之前,需要安裝MATLAB編譯器和相關(guān)的C/C++編譯器,并進(jìn)行相關(guān)配置。8.6.2編譯器的安裝與配置2023/2/4機(jī)械工業(yè)出版社Page112安裝MATLAB編譯器
在安裝MATLAB編譯器之前,需要安裝一個(gè)或多個(gè)與MATLAB兼容的ANSIC/C++編譯器,包括Lcc(MATLAB自帶的C語(yǔ)言編譯器,不能編譯C++代碼)、MicrosoftVisualC++、gcc和g++。MATLAB編譯器是MATLAB的一個(gè)組件,在MATLAB2010a中版本為4.12,在安裝MATLAB2010a時(shí)選中該組件即可。8.6.2編譯器的安裝與配置2023/2/4機(jī)械工業(yè)出版社Page1138.6.2編譯器的安裝與配置2023/2/4機(jī)械工業(yè)出版社Page114配置MATLAB編譯器
MATLAB編譯器只是完成m文件到C/C++文件的轉(zhuǎn)換,C/C++代碼的編譯是調(diào)用mbuild命令來(lái)完成的。所以在完成C/C++編譯器和MATLAB編譯器的安裝后,還需要對(duì)mbuild進(jìn)行配置。8.6.2編譯器的安裝與配置2023/2/4機(jī)械工業(yè)出版社Page115配置MATLAB編譯器
在MATLAB命令提示符下,輸入mbuild配置命令:
系統(tǒng)將顯示如下內(nèi)容:8.6.2編譯器的安裝與配置>>mbuild-setupPleasechooseyourcompilerforbuildingexternalinterface(MEX)files:Wouldyoulikembuildtolocateinstalledcompilers[y]/n?2023/2/4機(jī)械工業(yè)出版社Page116配置MATLAB編譯器
輸入“y”,mbuild命令會(huì)列出找到的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機(jī)械工業(yè)出版社Page117配置MATLAB編譯器
選擇[1]-[3]中的任一項(xiàng),mbuild命令將給出提示信息。選擇2給出的提示信息如下:8.6.2編譯器的安裝與配置Compiler:MicrosoftVisualC++2005SP1Locati
溫馨提示
- 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年大學(xué)試題(醫(yī)學(xué))-作業(yè)治療學(xué)歷年參考題庫(kù)含答案解析(5套典型考題)
- 2025年大學(xué)試題(體育科學(xué))-體育心理學(xué)歷年參考題庫(kù)含答案解析(5套典型考題)
- 2025年國(guó)家開(kāi)放大學(xué)(電大)-會(huì)計(jì)學(xué)(本科)歷年參考題庫(kù)含答案解析(5套典型考題)
- 2025年衛(wèi)生資格(中初級(jí))-中醫(yī)骨傷科學(xué)主治醫(yī)師歷年參考題庫(kù)含答案解析(5套典型題)
- 2025年保險(xiǎn)考試-保監(jiān)局高管考試歷年參考題庫(kù)含答案解析(5套典型考題)
- 2025年專(zhuān)業(yè)技術(shù)人員繼續(xù)教育公需科目-馬克思主義哲學(xué)及其社會(huì)實(shí)踐意義歷年參考題庫(kù)含答案解析(5套典型考題)
- 2025年專(zhuān)業(yè)技術(shù)人員繼續(xù)教育公需科目-公共服務(wù)能力歷年參考題庫(kù)含答案解析(5套典型考題)
- 《醉翁亭記》-暑假新九年級(jí)語(yǔ)文古詩(shī)文預(yù)習(xí)
- 倉(cāng)庫(kù)買(mǎi)賣(mài)協(xié)議書(shū)
- 人才代理協(xié)議書(shū)
- 十五五畜牧獸醫(yī)行業(yè)發(fā)展規(guī)劃
- 滬港通測(cè)試題及答案
- 實(shí)驗(yàn)室生物安全會(huì)議記錄內(nèi)容
- 2025-2030光學(xué)瞄準(zhǔn)具行業(yè)市場(chǎng)現(xiàn)狀供需分析及投資評(píng)估規(guī)劃分析研究報(bào)告
- T/CGAS 026.1-2023瓶裝液化石油氣管理規(guī)范第1部分:安全管理
- 美軍空域控制AirForceDo ctrinePublication3-52,AirspaceControl
- 工運(yùn)史試題及答案
- 儀表考試試題及答案
- 2025年中考英語(yǔ)復(fù)習(xí)難題速遞之閱讀理解-記敘文(2025年3月)
- 國(guó)家能源局:中國(guó)氫能發(fā)展報(bào)告2025
- app定制開(kāi)發(fā)合同協(xié)議
評(píng)論
0/150
提交評(píng)論