(2021年整理)在MATLAB環(huán)境下訪問(wèn)外部函數(shù)的共享庫(kù)文件_第1頁(yè)
(2021年整理)在MATLAB環(huán)境下訪問(wèn)外部函數(shù)的共享庫(kù)文件_第2頁(yè)
(2021年整理)在MATLAB環(huán)境下訪問(wèn)外部函數(shù)的共享庫(kù)文件_第3頁(yè)
(2021年整理)在MATLAB環(huán)境下訪問(wèn)外部函數(shù)的共享庫(kù)文件_第4頁(yè)
已閱讀5頁(yè),還剩17頁(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環(huán)境下訪問(wèn)外部函數(shù)的共享庫(kù)文件在matlab環(huán)境下訪問(wèn)外部函數(shù)的共享庫(kù)文件 編輯整理:尊敬的讀者朋友們:這里是精品文檔編輯中心,本文檔內(nèi)容是由我和我的同事精心編輯整理后發(fā)布的,發(fā)布之前我們對(duì)文中內(nèi)容進(jìn)行仔細(xì)校對(duì),但是難免會(huì)有疏漏的地方,但是任然希望(在matlab環(huán)境下訪問(wèn)外部函數(shù)的共享庫(kù)文件)的內(nèi)容能夠給您的工作和學(xué)習(xí)帶來(lái)便利。同時(shí)也真誠(chéng)的希望收到您的建議和反饋,這將是我們進(jìn)步的源泉,前進(jìn)的動(dòng)力。本文可編輯可修改,如果覺(jué)得對(duì)您有幫助請(qǐng)收藏以便隨時(shí)查閱,最后祝您生活愉快 業(yè)績(jī)進(jìn)步,以下為在matlab環(huán)境下訪問(wèn)外部函數(shù)的共享庫(kù)文件的全部?jī)?nèi)容。在matlab環(huán)境下訪問(wèn)外部函數(shù)的共享

2、庫(kù)文件,必須首先把該庫(kù)文件加載到內(nèi)存中。一旦加載成功,就能直接在matlab中直接請(qǐng)求關(guān)于函數(shù)的任何信息。而當(dāng)不再需要該庫(kù)時(shí),就應(yīng)當(dāng)及時(shí)把庫(kù)文件從內(nèi)存中卸載以節(jié)省內(nèi)存開銷。加載庫(kù)語(yǔ)法:loadlibrary(shrlib,hfile)其中shrlib為加載的動(dòng)態(tài)鏈接庫(kù)文件名(filename。dll),hfile為頭文件名,它包含函數(shù)原型。例如,當(dāng)加載包含matlab中mx程序的libmx庫(kù)時(shí),可以使用下列語(yǔ)句.hfile=matlabrootexternincludematrix。h;loadlibray(libmx, hfile)卸載庫(kù)語(yǔ)法:unloadlibrary libmx使用兩個(gè)函

3、數(shù)可以獲取加載庫(kù)的信息:libfunctions(libname) or libfunctions libnamelibfunctionsview(libname) or libfunctionsview libname這兩個(gè)函數(shù)的不同之處在于顯示結(jié)果的方式不同,后者是以圖形的方式顯示在新的窗口中.而前者返回庫(kù)libmx中有哪些可用的函數(shù)。請(qǐng)看示例:libfunctions libmxmethods for class lib。libmx:mxaddfield mxgetfieldnumber mxislogicalscalartruemxarraytostring mxgetimagdata

4、 mxisnanmxcalcsinglesubscript mxgetinf mxisnumericmxcalloc mxgetir mxisobjectmxclearscalardoubleflag mxgetjc mxisopaquemxcreatecellarray mxgetlogicals mxisscalardoubleflagset如果加上命令開頭full,則可以顯示函數(shù)返回值的細(xì)節(jié)。libfunctions libmx -fullmethods for class lib。libmx:mxclassid, matlab array mxgetclassid(matlab arr

5、ay)lib。pointer, matlab array mxgetdata(matlab array)matlab array, voidptr mxsetdata(matlab array, voidptr)lib。pointer, matlab array mxgetpr(matlab array)matlab array, doubleptr mxsetpr(matlab array, doubleptr)uint8 mxisfinite(double)uint8 mxisinf(double)值得注意的是,這兩個(gè)函數(shù)返回值的類型均是matlab的數(shù)據(jù)類型,雖然函數(shù)是利用c語(yǔ)言編寫的。

6、調(diào)用庫(kù)函數(shù)一旦庫(kù)函數(shù)被加載到了內(nèi)存空間,只要指定庫(kù)名、函數(shù)名和變量就可以使用calllib函數(shù)調(diào)用庫(kù)中的任何函數(shù)了。語(yǔ)法格式:calllib(libname,funcname,arg1,argn)下列語(yǔ)句顯示如何操作:hfile=c:matlab7externincludematrix.h;loadlibrary(libmx,hfile);y=rand(4,7,2); %produce a 3d array, there are 56 elements in itcalllib(libmx,mxgetnumberofelements,y)ans=56calllib(libmx,mxgetcla

7、ssid,y)ans=mxdouble_class傳遞變量當(dāng)調(diào)用外部庫(kù)里的函數(shù)時(shí),該為函數(shù)提供哪種類型的變量呢?matlab的externexamplesshrlibshrlibsample庫(kù)里對(duì)每一種特殊的變量類型都作出了說(shuō)明。但我們首先必須把該庫(kù)文件的路徑添加到matlab的搜索路徑中來(lái),或者使該庫(kù)文件所在的目錄成為當(dāng)前目錄,兩種做法的命令如下。addpath(c:matlab7externexamplesshrlib)cd(c:matlab7externexamplesshrlib)下面的例子就是加載該庫(kù)并顯示了其中的一些函數(shù)。loadlibrary shrlibsample shrli

8、bsample.hlibfunctions shrlibsample full執(zhí)行上述兩行后,返回:functions in library shrlibsample:double, doubleptr adddoubleref(double, doubleptr, double)double addmixedtypes(int16, int32, double)double, c_structptr addstructbyref(c_structptr)double addstructfields(c_struct)c_structptrptr allocatestruct(c_struct

9、ptrptr)voidptr deallocatestruct(voidptr)doubleptr multdoublearray(doubleptr, int32)lib.pointer, doubleptr multdoubleref(doubleptr)int16ptr multiplyshort(int16ptr, int32)string readenum(enum1)string, string stringtoupper(string)這里所有的函數(shù)都是用c語(yǔ)言編寫的.一些通用的規(guī)則在函數(shù)的輸入輸出變量問(wèn)題上,以下幾點(diǎn)應(yīng)注意:1。許多變量類型,象int32、double與c語(yǔ)言的

10、數(shù)據(jù)類型非常相象.這些變量只需要傳遞matlab型的數(shù)據(jù)就可以了.2。而有些c語(yǔ)言的變量類型,象*double、還有預(yù)定義型與標(biāo)準(zhǔn)matlab數(shù)據(jù)類型是完全不同的。這種情況下,有兩種選擇,要么給外部函數(shù)的入?yún)鬟f標(biāo)準(zhǔn)的matlab數(shù)據(jù)類型,讓matlab程序自動(dòng)轉(zhuǎn)化,要么先使用matlab提供的轉(zhuǎn)化函數(shù),如libstruct、libpointer自己轉(zhuǎn)化。關(guān)于轉(zhuǎn)化,可以參考data conversion.3.c語(yǔ)言通??梢园葱螀鬟f變量,但matlab不支持這種做法,不過(guò)可以創(chuàng)造matlabptr或ptrptr型的變量,去兼容c語(yǔ)言的形參。4。c語(yǔ)言通常還可以通過(guò)形參來(lái)返回輸入變量的值,而ma

11、tlab需要額外的變量來(lái)獲得返回值。傳遞變量的通用規(guī)則1。庫(kù)函數(shù)傳遞形參時(shí),標(biāo)量不必非得聲明.2。如果庫(kù)函數(shù)使用單下標(biāo)來(lái)引用二維矩陣元素時(shí),請(qǐng)記住,c語(yǔ)言是逐行處理矩陣元素,而matlab是按列優(yōu)先處理的。因此迎合c語(yǔ)言的習(xí)慣,可以在給matlab函數(shù)傳遞變量之前把矩陣進(jìn)行轉(zhuǎn)置,從函數(shù)返回后再轉(zhuǎn)置回來(lái)就行了.3.由上可知,當(dāng)傳遞的矩陣超過(guò)二維時(shí),matlab會(huì)改變矩陣的行列結(jié)構(gòu),為了確保矩陣的結(jié)構(gòu)不被破壞,可以事先記錄矩陣的結(jié)構(gòu),在調(diào)用結(jié)束后利用reshape函數(shù)還原即可.例如:vs=size(vin); suppose the dimention of vector vin is 2-by-

12、5by2vout=calllib(shrlibsample,multdoublearray,vin,20); %dimention have been altered ans= 2 10vout=reshape(vout,vs); %restore the array to 2-by-5by-2size(vout)ans= 2 5 24.當(dāng)支持可選參數(shù)時(shí),可用一空矩陣來(lái)傳遞一個(gè)null型參數(shù)。這是在變量為ptr或ptrptr型時(shí)唯一的選擇。傳參外部庫(kù)的許多函數(shù)是傳遞形參的,為了能與這些函數(shù)交互,matlab通常傳遞一個(gè)叫“指針對(duì)象的變量,不過(guò)別把它與傳參混同了。數(shù)據(jù)轉(zhuǎn)化在多數(shù)情況下,傳遞給外部

13、庫(kù)函數(shù)或從外部庫(kù)函數(shù)返回的數(shù)據(jù)類型自動(dòng)被matlab轉(zhuǎn)化,然而,或許你偶爾也希望有些時(shí)侯能手動(dòng)轉(zhuǎn)化:1。當(dāng)需要傳遞相同的數(shù)據(jù)給一系列庫(kù)函數(shù)時(shí),可能手動(dòng)轉(zhuǎn)化要比讓matlab自動(dòng)轉(zhuǎn)化更為明智,更能節(jié)省時(shí)間.2。當(dāng)傳遞大結(jié)構(gòu)的數(shù)據(jù)時(shí),手動(dòng)轉(zhuǎn)化數(shù)據(jù)使之匹配c結(jié)構(gòu)而不是直接采用通用的matlab型數(shù)據(jù)的做法,比直接使用libstruct函數(shù)把c結(jié)構(gòu)型的數(shù)據(jù)轉(zhuǎn)換成matlab型數(shù)據(jù)更能節(jié)省內(nèi)存.3。當(dāng)外部函數(shù)使用超過(guò)一層引用(例如,指向指針的指針變量double *)時(shí),用libpointer函數(shù)構(gòu)造一個(gè)參數(shù),比直接讓matlab自動(dòng)轉(zhuǎn)化數(shù)據(jù)要好。原始類型共享庫(kù)接口支持所有標(biāo)準(zhǔn)c數(shù)據(jù)類型。下表顯示了c與

14、matlab等價(jià)的數(shù)據(jù)類型。c類型(32位機(jī)器)等價(jià)matlab類型char, byteint8unsigned char, byteuint8shortint16unsigned shortuint16int, longint32unsigned int, unsigned longuint32floatsingledoubledoublechar string(1by-n char array)下表顯示的lib。pointer類中的數(shù)據(jù)類型,非matlab標(biāo)準(zhǔn)類型c數(shù)據(jù)類型(32位機(jī)器)擴(kuò)展matlab數(shù)據(jù)類型integer pointer types (int *)(u) int (si

15、ze) ptrfloat singleptrdouble doubleptrmxarray *matlab arrayvoid voidptrtype same as typeptr with an added ptr(e.g。,double * is doubleptrptr)matlab可以自動(dòng)把轉(zhuǎn)化數(shù)據(jù)為外部庫(kù)函數(shù)所需要的任何原型數(shù)據(jù),這就意味著可以傳遞一個(gè)雙精度型數(shù)據(jù)給一個(gè)8位整數(shù)型變量。下述c函數(shù)接受短整型、整型和雙精度型數(shù)據(jù):double addmixedtypes(short x, int y, double z) return (x+y+z);你可以極其簡(jiǎn)單地在matlab中只

16、傳遞給該函數(shù)以雙精度變量,matlab自動(dòng)判斷每個(gè)變量接受何種類型的變量,并作近似轉(zhuǎn)化.calllib (shrlibsample,addmixedtypes, 127, 33000, pi)ans= 3.3130e+004轉(zhuǎn)化參數(shù)當(dāng)外部函數(shù)原型定義一個(gè)形參時(shí),matlab能自動(dòng)地把一個(gè)按值傳遞的變量轉(zhuǎn)化為形參.因此,當(dāng)給一個(gè)雙精度指針變量賦一雙精度變量時(shí),matlab會(huì)自動(dòng)地把該雙精度變量轉(zhuǎn)化為雙精度形參。adddoubleref是一個(gè)接受雙精度指針型形參的函數(shù):double adddoubleref( double x, bouble *y, double z) return (x+ *y

17、 +z);用三個(gè)雙精度變量調(diào)用該函數(shù),matlab自動(dòng)處理數(shù)據(jù)轉(zhuǎn)化:calllib (shrlibsample, adddoubleref, 1.78, 5.42, 13.3)ans= 20.5000字符串當(dāng)變量需要字符型指針數(shù)據(jù)時(shí),你可以傳遞一個(gè)matlab型字符串(矩陣)。下述c函數(shù)接受一個(gè)字符指針型數(shù)據(jù):char * stringtoupper (char input) char *p=input; if (p!=null) while (*p!=0) p+=toupper(*p); return input;libfunctions顯示,你可以用一個(gè)matlab字符串作為輸入。libf

18、unctions shrlibsample full string, string stringtoupper (string )定義一個(gè)matlab字符矩陣str,把它傳遞給變量。str=this was a mixed case string; %matlab中字符串以“”號(hào)對(duì)表示calllib( shrlibsample, stringtoupper, str)ans= this was a mixed string注意:雖然matlab傳遞給變量的很象字符型的形參,但它并不真正的參數(shù)類型.因?yàn)樗⒉话╩atlab字符矩陣str的地址。因此當(dāng)函數(shù)執(zhí)行完畢時(shí),字符串的值并未改變。枚舉型如

19、果變量被定義為c中的枚舉型,你可以傳遞枚舉型或一個(gè)與枚舉值等價(jià)的整數(shù).shrlibsample庫(kù)中的readenum函數(shù)返回與傳入變量相應(yīng)的枚舉型。下述為enum1的定義和c語(yǔ)言函數(shù)readenum:enum enum1 en1=1,en2, en4=4 tenum1;char *readenum(tenum1 val) switch (val) case 1:return “you chose en1”; case 2:return “you chose en2; case 4:return “you chose en4”; default: return “enum not defined

20、”; matlab,你可以用一個(gè)枚舉型字符或等價(jià)的整數(shù)來(lái)表示枚舉型數(shù)據(jù)。上述中定義的枚舉型數(shù)據(jù)tenum1中,en4與4等價(jià):calllib (shrlibsample, readenum, en4)ans= you chose en4calllib (shrlibsampel, readenum, 4)ans= you chose en4結(jié)構(gòu)體型當(dāng)庫(kù)函數(shù)接受結(jié)構(gòu)體型變量時(shí),你需要給它傳遞與在結(jié)構(gòu)體定義時(shí)擁有相同域名的結(jié)構(gòu)體變量。為了確定結(jié)構(gòu)體變量的域和類型,你可以:1.查詢庫(kù)文檔2.在加載到matlab的庫(kù)的頭文件中尋找結(jié)構(gòu)體的定義。你也可以在matlab中采用下述步驟來(lái)確定外部函數(shù)定義過(guò)的

21、結(jié)構(gòu)體的域名.1。利用libfunctionsview函數(shù)來(lái)顯示正在使用的庫(kù)函數(shù)的信息,它包含了每一個(gè)函數(shù)所做用的結(jié)構(gòu)體數(shù)據(jù)的名字.當(dāng)鍵入libfunctionsview shrlibsample命令時(shí),matlab就會(huì)在新窗口中顯示庫(kù)函數(shù)的信息。如:double addstructfields (c_struct)2。利用libstruct函數(shù)獲取結(jié)構(gòu)體定義模型。如s=libstruct( c_struct);3。繼而利用get函數(shù)返回結(jié)構(gòu)體數(shù)據(jù)的域名。如get(s) p1:0 p2:0 p3:04.利用calllib函數(shù)初始化所需要傳遞給庫(kù)函數(shù)的域值。如s.p1=478; s.p2=299

22、; s。p3=1000; calllib (shrlibsample, addstructfields, s)當(dāng)你利用calllib函數(shù)創(chuàng)建或初始化結(jié)構(gòu)體數(shù)據(jù)時(shí),不必去匹配結(jié)構(gòu)體的數(shù)據(jù)域,matlab會(huì)自動(dòng)轉(zhuǎn)化數(shù)據(jù)類型.指定結(jié)構(gòu)體域名下面是在為外部庫(kù)函數(shù)傳遞結(jié)構(gòu)體數(shù)據(jù)時(shí)一般的做法:1。結(jié)構(gòu)體數(shù)據(jù)可能只包含了定義中很少的一部分域,matlab會(huì)把其余的域初始化為0。2.你所使用的任何結(jié)構(gòu)體的域名須與定義中的域名一致。3。結(jié)構(gòu)體中不能包含庫(kù)函數(shù)中未定義過(guò)的域名。傳遞matlab結(jié)構(gòu)體與其他的數(shù)據(jù)類型一樣,當(dāng)外部函數(shù)接受結(jié)構(gòu)體變量數(shù)據(jù)類型時(shí),就可以傳遞一個(gè)matlab型結(jié)構(gòu)體數(shù)據(jù)給它.結(jié)構(gòu)體的域名必

23、須與庫(kù)函數(shù)定義中的域名一致,而數(shù)值類型則可以不同,由matlab自動(dòng)轉(zhuǎn)換完成。如shrlibsample共享庫(kù)中定義了這樣的c結(jié)構(gòu)和函數(shù):struct c_struct double p1; short p2; long p3; ;double addstructfield (struct c_struct st ) double t=st。p1 +st.p2 +st。p3; return t; 下面的代碼完成向addstructfield函數(shù)傳遞一個(gè)結(jié)構(gòu)體變量sm,包含三個(gè)雙精度數(shù)據(jù),即傳遞的數(shù)值類型與c定義中的不一樣,但域外必須相同,否則傳遞不進(jìn)去:sm.p1=476; sm。p2=299

24、; sm。p3=1000;calllib(shrlibsample, addstructfields, sm )ans= 1177傳遞結(jié)構(gòu)體對(duì)象當(dāng)為外部函數(shù)傳遞結(jié)構(gòu)體變量時(shí),matlab為了確保傳遞成功,要求域名必須與庫(kù)函數(shù)定義中的一致,而對(duì)數(shù)值類型則不加強(qiáng)求,由matlab自動(dòng)轉(zhuǎn)換成庫(kù)函數(shù)中對(duì)應(yīng)域的數(shù)值類型,并且把空域的值均初始化為零。當(dāng)結(jié)構(gòu)體數(shù)據(jù)較小時(shí),這種做法很有效。然而,當(dāng)重復(fù)傳遞一個(gè)或多個(gè)大的結(jié)構(gòu)體數(shù)據(jù)時(shí),手動(dòng)轉(zhuǎn)化是更明智的選擇,不僅可以節(jié)省時(shí)間,還可以節(jié)省內(nèi)存和空間。使用libstruct函數(shù)s=libstruct (structtype, mlstruct)返回值s叫做libst

25、ruct對(duì)象。雖然它實(shí)際上是matlab的一個(gè)對(duì)象,但它更象是一個(gè)結(jié)構(gòu)體數(shù)據(jù).這個(gè)新的所謂“結(jié)構(gòu)體的域名得自于外部庫(kù)函數(shù)中結(jié)構(gòu)體的域名.例如,把matlab結(jié)構(gòu)體sm轉(zhuǎn)換成libstruct對(duì)象sc:sm。p1=476; sm.p2=-299; sm.p3=1000;sc=libstruct (c_struct, sm);sm的原始結(jié)構(gòu)中域值為三個(gè)雙精度型,而libstruct函數(shù)轉(zhuǎn)換后的sc對(duì)象的域名則與c_struct結(jié)構(gòu)體一致,分別為double、short和long型。創(chuàng)建空l(shuí)ibstruct對(duì)象s=libstruct (structtype)這種調(diào)用格式可以生成域名完整,域值為0的空

26、libstruct對(duì)象。使用結(jié)構(gòu)體作為對(duì)象libstruct轉(zhuǎn)換后的結(jié)構(gòu)體實(shí)際上是lib。c_struct類中的一個(gè)對(duì)象實(shí)例,這一點(diǎn)可以通過(guò)whos命令的輸出來(lái)驗(yàn)證:whos scname size bytes classsc 1by1 lib.c_structgrand total is 1 element using 0 bytes域已經(jīng)被當(dāng)成了lib.c_struct類的屬性來(lái)處理了。你可以利用基于對(duì)象的函數(shù)set和get來(lái)讀寫:sc=libstruct ( c_struct );set (sc, p1,100, p2, 150, p3, 200 ); 對(duì)象讀寫須用get、setget(

27、sc) p1:100 p2:150 p3:200但是你也可以象處理結(jié)構(gòu)體數(shù)據(jù)那樣簡(jiǎn)單地對(duì)sc進(jìn)行讀寫:sc.p1=23; 而結(jié)構(gòu)體的域可以直接賦值sc。p1ans= 23創(chuàng)建形參你可以為外部函數(shù)按值傳遞大多數(shù)的變量,即使函數(shù)原型要求形參傳遞,然而有時(shí)你會(huì)發(fā)現(xiàn)這與直接給c傳遞形參一樣揍效。使用庫(kù)指針函數(shù)用函數(shù)libpointer構(gòu)造一個(gè)形參的語(yǔ)法如下:p=libpointer(type, value)例如要?jiǎng)?chuàng)建一個(gè)指向int16數(shù)據(jù)類型的指針pv,就得先指定指針的類型,并以ptr作后綴:v=int16(485);pv=libpointer(int16prt, v);返回值pv實(shí)際就是matlab

28、中l(wèi)ib。pointer類的一個(gè)實(shí)例。lib。pointer有屬性值和數(shù)據(jù)類型。你可以用get或set函數(shù)來(lái)讀或?qū)戇@些屬性.get(pv) value:485datatype:int16ptrlib。pointer類還有另外兩種方法setdatatype和reshape.methods(pv)methods for class lib.pointer:setdatatype reshape為原始類型創(chuàng)建形參如何去創(chuàng)建和傳遞指針給雙精度型,又如何輸出數(shù)據(jù)這里有一個(gè)簡(jiǎn)單的例子可以說(shuō)明。函數(shù)multdoubleref接受一個(gè)雙精度形參同時(shí)返回雙精度型。double multdoubleref(dou

29、ble *x) x =5; return x;輸入數(shù)據(jù)x來(lái)創(chuàng)建一個(gè)形參xp: x=15; xp=libpointer(doubleptr,x); get(xp) value:15 datatype:doubleptr現(xiàn)在可以調(diào)用函數(shù)來(lái)檢驗(yàn)結(jié)果:calllib(shrlibsample, multdoubleref, xp);get(xp, value)ans= 75注意:xp雖然是作為x的形參而創(chuàng)建的,但它并非真的象c語(yǔ)言的指針,因?yàn)閤p中并不包含x的地址,因此,當(dāng)函數(shù)執(zhí)行時(shí),函數(shù)修改xp的屬性值,但它并不修改x的值。獲得函數(shù)的返回值在上述最后一例子中,從matlab調(diào)用的函數(shù)返回值可以通過(guò)檢

30、查修改了的輸入形參來(lái)獲得,但這個(gè)函數(shù)也可以通過(guò)輸出變量來(lái)獲得.這個(gè)函數(shù)的matlab原型表明(利用libfunctions shrlibsample full查看原型),它返回了兩個(gè)輸出變量,一為lib.pointer類的對(duì)象,另一為dlubleptr輸入變量的屬性值:libfunctions shrlibsample fulllib.pointer, doubleptr multdoubleref (doubleptr)再次運(yùn)行這個(gè)例程,但這次檢查返回值x=15;xp=libpointer( doubleptr, x);xobj, xval=calllib(shrlibsample, mul

31、tdoubleref, xp)xobj= lib.pointerxval= 75創(chuàng)建結(jié)構(gòu)體形參與創(chuàng)建原始類型的形參相比,創(chuàng)建結(jié)構(gòu)體的形參并非難事。下述函數(shù)只接受c語(yǔ)言形式的結(jié)構(gòu)體形參,它的返回值是所有結(jié)構(gòu)體域值之和,同時(shí)也修改了輸入?yún)⒘?。double addstructbyref( struct c_struct *st ) double t=stp1+stp2+stp3; stp1=5.5; st-p2=1234; stp3=12345678; return t;(1)傳遞結(jié)構(gòu)體本身雖然這個(gè)函數(shù)期望獲得一個(gè)結(jié)構(gòu)體的輸入?yún)⒘?下列給形參傳遞了一個(gè)matlab的結(jié)構(gòu)體sm,返回值是正確的,因?yàn)閟

32、m不是按址傳遞,所以sm的域值并未被函數(shù)修改。sm。p1=476; sm.p2=-299; sm。p3=1000;x=calllib(shrlibsample, addstructbyref, sm)x= 1177(2)傳遞結(jié)構(gòu)體形參sp=libpointer( c_struct, sm);calllib(shrlibsample, addstructbyref, sp )ans= 1177get(sp,value)ans= p1:5.5000 p2:1234 p3:12345678形參指針當(dāng)變量超過(guò)一層引用(例如,uint16 *)就是這里提到的形參指針。在matlab中,這類變量類型都加以

33、后綴ptrptr。當(dāng)調(diào)用一個(gè)接受形參指針的函數(shù)時(shí),你可以使用一個(gè)形參變量代替,matlab將會(huì)把該形參變量轉(zhuǎn)換為形參指針。例如,外部函數(shù)allocatestruct接受一個(gè)c_structptrptr變量:libfunctions shrlibsample full c_structptrptr allocatestruct(c_structprtptr)c語(yǔ)言編寫的該函數(shù):void allocatestruct (struct c_struct *val) val=(struct c_struct *) malloc(sizeof(sturct c_struct)); (*val)-p1=1

34、2。4; (*val)p2=222; (val)p3=333333;該函數(shù)原型需要一個(gè)c_structptrptr型數(shù)據(jù),但你可以只傳遞一個(gè)c_structptr型數(shù)據(jù),讓matlab完成第二層引用。下例創(chuàng)建了一個(gè)空的結(jié)構(gòu)體形參傳遞給allocatestruct函數(shù):sp=libpointer (c_structptr);calllib( shrlibsample, allocatestruct, sp)get(sp)ans= value:1-by1 struct datatype:c_structptrget(sp, value)ans= p1:12.4000 p2:222 p3:33333

35、3完成之后,記得從內(nèi)存中刪除該對(duì)象以釋放空間:calllib( shrlibsample, deallocatestruct, sp)matlab外部接口你可以在matlab中調(diào)用自己編寫的c函數(shù),matlab會(huì)讓你感覺(jué)就象調(diào)用matlab自身內(nèi)建函數(shù)一樣輕松。matlab中可以調(diào)用的c函數(shù)就是mex文件,mex文件是matlab解釋器能自動(dòng)加載和執(zhí)行的子程序。mex文件有幾個(gè)應(yīng)用:1。不必為調(diào)用大型c程序而把它改寫成matlab默認(rèn)的m文件。2.解決計(jì)算的一些瓶頸問(wèn)題,在matlab中做一些循環(huán)計(jì)算時(shí)效率不如c語(yǔ)言。mex文件不適合所有的應(yīng)用,matlab是一個(gè)高效率的系統(tǒng),與c和forta

36、n編譯相比,它能有效降低耗時(shí).一般多數(shù)編程matlab均能解決,因此除非你的應(yīng)用程序確實(shí)需要mex文件,否則不必使用mex文件。使用mex文件mex文件是c或fortran代碼的子程序,它的運(yùn)行就象m文件和內(nèi)建函數(shù)。matlab識(shí)別mex文件是根據(jù)不同操作平臺(tái)文件的擴(kuò)展名,而m文件的擴(kuò)展名(。m)與操作平臺(tái)無(wú)關(guān)。不如操作系統(tǒng)下mex文件的擴(kuò)展名如下:操作系統(tǒng)平臺(tái)mex文件擴(kuò)展名hp-uxmexhpuxlinuxmexglxmacintoshmexmacsolarismexsolwindowsdll你可以準(zhǔn)確地調(diào)用mex文件就如同調(diào)用m文件。例如,磁盤的datafun toolbox目錄上有一conv2。mex的mex文件,它能實(shí)現(xiàn)一個(gè)二維矩陣的轉(zhuǎn)換,而conv2.m文件只包含幫助文檔.如果從matlab內(nèi)部調(diào)用函數(shù)conv2,解釋器將在matlab的搜索路徑(默認(rèn)的路徑有多條)上查找,直至找到第一次出現(xiàn)的conv2的文件和相應(yīng)的擴(kuò)展名,然后加載并執(zhí)行

溫馨提示

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