




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、在MATLAB環(huán)境下訪問外部函數(shù)的共享庫文件,必須首先把該庫文件加載到內(nèi)存中。一旦加載成功,就能直接在MATLAB中直接請求關(guān)于函數(shù)的任何信息。而當(dāng)不再需要該庫時(shí),就應(yīng)當(dāng)及時(shí)把庫文件從內(nèi)存中卸載以節(jié)省內(nèi)存開銷。加載庫語法:loadlibrary(shrlib,hfile)其中shrlib為加載的動態(tài)鏈接庫文件名(filename.dll),hfile為頭文件名,它包含函數(shù)原型。例如,當(dāng)加載包含MATLAB中mx程序的libmx庫時(shí),可以使用下列語句。hfile=matlabrootexternincludematrix.h;loadlibray(libmx, hfile)卸載庫語法:unloa
2、dlibrary libmx使用兩個(gè)函數(shù)可以獲取加載庫的信息:libfunctions(libname) or libfunctions libnamelibfunctionsview(libname) or libfunctionsview libname這兩個(gè)函數(shù)的不同之處在于顯示結(jié)果的方式不同,后者是以圖形的方式顯示在新的窗口中。而前者返回庫libmx中有哪些可用的函數(shù)。請看示例:libfunctions libmxMethods for class lib.libmx:mxAddField mxGetFieldNumber mxIsLogicalScalarTruemxArrayToS
3、tring mxGetImagData mxIsNaNmxCalcSingleSubscript mxGetInf mxIsNumericmxCalloc mxGetIr mxIsObjectmxClearScalarDoubleFlag mxGetJc mxIsOpaquemxCreateCellArray mxGetLogicals mxIsScalarDoubleFlagSet如果加上命令開頭-full,則可以顯示函數(shù)返回值的細(xì)節(jié)。libfunctions libmx -fullMethods for class lib.libmx:mxClassID, MATLAB array mxG
4、etClassID(MATLAB array)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
5、的數(shù)據(jù)類型,雖然函數(shù)是利用C語言編寫的。調(diào)用庫函數(shù)一旦庫函數(shù)被加載到了內(nèi)存空間,只要指定庫名、函數(shù)名和變量就可以使用calllib函數(shù)調(diào)用庫中的任何函數(shù)了。語法格式:calllib(libname,funcname,arg1,argn)下列語句顯示如何操作: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=56Ca
6、lllib(libmx,mxGetClassID,y)ans=mxDouble_CLASS傳遞變量當(dāng)調(diào)用外部庫里的函數(shù)時(shí),該為函數(shù)提供哪種類型的變量呢?MATLAB的externexamplesshrlibshrlibsample庫里對每一種特殊的變量類型都作出了說明。但我們首先必須把該庫文件的路徑添加到MATLAB的搜索路徑中來,或者使該庫文件所在的目錄成為當(dāng)前目錄,兩種做法的命令如下。addpath(C:MATLAB7externexamplesshrlib)cd(C:MATLAB7externexamplesshrlib)下面的例子就是加載該庫并顯示了其中的一些函數(shù)。loadlibrar
7、y shrlibsample shrlibsample.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 all
8、ocateStruct(c_structPtrPtr)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語言編寫的。一些通用的規(guī)則在函數(shù)的輸入輸出變量問題上,以下幾點(diǎn)應(yīng)注意:1.許多變量類
9、型,象int32、double與C語言的數(shù)據(jù)類型非常相象。這些變量只需要傳遞MATLAB型的數(shù)據(jù)就可以了。2.而有些C語言的變量類型,象*double、還有預(yù)定義型與標(biāo)準(zhǔn)MATLAB數(shù)據(jù)類型是完全不同的。這種情況下,有兩種選擇,要么給外部函數(shù)的入?yún)鬟f標(biāo)準(zhǔn)的MATLAB數(shù)據(jù)類型,讓MATLAB程序自動轉(zhuǎn)化,要么先使用MATLAB提供的轉(zhuǎn)化函數(shù),如libstruct、libpointer自己轉(zhuǎn)化。關(guān)于轉(zhuǎn)化,可以參考Data Conversion。3.C語言通??梢园葱螀鬟f變量,但MATLAB不支持這種做法,不過可以創(chuàng)造MATLABPtr或PtrPtr型的變量,去兼容C語言的形參。4.C語言通常
10、還可以通過形參來返回輸入變量的值,而MATLAB需要額外的變量來獲得返回值。傳遞變量的通用規(guī)則1.庫函數(shù)傳遞形參時(shí),標(biāo)量不必非得聲明。2.如果庫函數(shù)使用單下標(biāo)來引用二維矩陣元素時(shí),請記住,C語言是逐行處理矩陣元素,而MATLAB是按列優(yōu)先處理的。因此迎合C語言的習(xí)慣,可以在給MATLAB函數(shù)傳遞變量之前把矩陣進(jìn)行轉(zhuǎn)置,從函數(shù)返回后再轉(zhuǎn)置回來就行了。3.由上可知,當(dāng)傳遞的矩陣超過二維時(shí),MATLAB會改變矩陣的行列結(jié)構(gòu),為了確保矩陣的結(jié)構(gòu)不被破壞,可以事先記錄矩陣的結(jié)構(gòu),在調(diào)用結(jié)束后利用reshape函數(shù)還原即可。例如:vs=size(vin); %suppose the dimention o
11、f vector vin is 2-by-5-by2vout=calllib(shrlibsample,multDoubleArray,vin,20); %dimention have been altered ans= 2 10vout=reshape(vout,vs); %Restore the array to 2-by-5-by-2size(vout)ans= 2 5 24.當(dāng)支持可選參數(shù)時(shí),可用一空矩陣來傳遞一個(gè)NULL型參數(shù)。這是在變量為Ptr或PtrPtr型時(shí)唯一的選擇。傳參外部庫的許多函數(shù)是傳遞形參的,為了能與這些函數(shù)交互,MATLAB通常傳遞一個(gè)叫“指針對象”的變量,不過別把
12、它與傳參混同了。數(shù)據(jù)轉(zhuǎn)化在多數(shù)情況下,傳遞給外部庫函數(shù)或從外部庫函數(shù)返回的數(shù)據(jù)類型自動被MATLAB轉(zhuǎn)化,然而,或許你偶爾也希望有些時(shí)侯能手動轉(zhuǎn)化:1.當(dāng)需要傳遞相同的數(shù)據(jù)給一系列庫函數(shù)時(shí),可能手動轉(zhuǎn)化要比讓MATLAB自動轉(zhuǎn)化更為明智,更能節(jié)省時(shí)間。2.當(dāng)傳遞大結(jié)構(gòu)的數(shù)據(jù)時(shí),手動轉(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ù)使用超過一層引用(例如,指向指針的指針變量double *)時(shí),用libpointer函數(shù)構(gòu)造一個(gè)參數(shù),比直接讓MATLAB自動轉(zhuǎn)化數(shù)據(jù)要好。原始類型
13、共享庫接口支持所有標(biāo)準(zhǔn)C數(shù)據(jù)類型。下表顯示了C與MATLAB等價(jià)的數(shù)據(jù)類型。C類型(32位機(jī)器)等價(jià)MATLAB類型char, byteint8unsigned char, byteuint8shortint16unsigned shortuint16int, longint32unsigned int, unsigned longuint32floatsingledoubledoublechar *string(1-by-n char array)下表顯示的lib.pointer類中的數(shù)據(jù)類型,非MATLAB標(biāo)準(zhǔn)類型C數(shù)據(jù)類型(32位機(jī)器)擴(kuò)展MATLAB數(shù)據(jù)類型integer pointe
14、r types (int *)(u) int (size) Ptrfloat *singlePtrdouble *doublePtrmxArray *MATLAB arrayvoid *voidPtrtype *same as typePtr with an added Ptr(e.g.,double * is doublePtrPtr)MATLAB可以自動把轉(zhuǎn)化數(shù)據(jù)為外部庫函數(shù)所需要的任何原型數(shù)據(jù),這就意味著可以傳遞一個(gè)雙精度型數(shù)據(jù)給一個(gè)8位整數(shù)型變量。下述C函數(shù)接受短整型、整型和雙精度型數(shù)據(jù):double addMixedTypes(short x, int y, double z) re
15、turn (x+y+z);你可以極其簡單地在MATLAB中只傳遞給該函數(shù)以雙精度變量,MATLAB自動判斷每個(gè)變量接受何種類型的變量,并作近似轉(zhuǎn)化。calllib (shrlibsample,addMixedTypes, 127, 33000, pi)ans= 3.3130e+004轉(zhuǎn)化參數(shù)當(dāng)外部函數(shù)原型定義一個(gè)形參時(shí),MATLAB能自動地把一個(gè)按值傳遞的變量轉(zhuǎn)化為形參。因此,當(dāng)給一個(gè)雙精度指針變量賦一雙精度變量時(shí),MATLAB會自動地把該雙精度變量轉(zhuǎn)化為雙精度形參。addDoubleRef是一個(gè)接受雙精度指針型形參的函數(shù):double addDoubleRef( double x, boub
16、le *y, double z) return (x+ *y +z);用三個(gè)雙精度變量調(diào)用該函數(shù),MATLAB自動處理數(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;libfunc
17、tions顯示,你可以用一個(gè)MATLAB字符串作為輸入。libfunctions shrlibsample full string, string stringToUpper (string )定義一個(gè)MATLAB字符矩陣str,把它傳遞給變量。str=This was a Mixed Case string; %MATLAB中字符串以“”號對表示calllib( shrlibsample, stringToUpper, str)ans= THIS WAS A MIXED STRING注意:雖然MATLAB傳遞給變量的很象字符型的形參,但它并不真正的參數(shù)類型。因?yàn)樗⒉话∕ATLAB字符矩陣
18、str的地址。因此當(dāng)函數(shù)執(zhí)行完畢時(shí),字符串的值并未改變。枚舉型如果變量被定義為C中的枚舉型,你可以傳遞枚舉型或一個(gè)與枚舉值等價(jià)的整數(shù)。shrlibsample庫中的readEnum函數(shù)返回與傳入變量相應(yīng)的枚舉型。下述為Enum1的定義和C語言函數(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”;
19、default: return “enum not defined”; MATLAB,你可以用一個(gè)枚舉型字符或等價(jià)的整數(shù)來表示枚舉型數(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)庫函數(shù)接受結(jié)構(gòu)體型變量時(shí),你需要給它傳遞與在結(jié)構(gòu)體定義時(shí)擁有相同域名的結(jié)構(gòu)體變量。為了確定結(jié)構(gòu)體變量的域和類型,你可以:1.查詢庫文檔2.在加載到MATLAB的庫的頭文件中尋找結(jié)構(gòu)體
20、的定義。你也可以在MATLAB中采用下述步驟來確定外部函數(shù)定義過的結(jié)構(gòu)體的域名。1.利用libfunctionsview函數(shù)來顯示正在使用的庫函數(shù)的信息,它包含了每一個(gè)函數(shù)所做用的結(jié)構(gòu)體數(shù)據(jù)的名字。當(dāng)鍵入libfunctionsview shrlibsample命令時(shí),MATLAB就會在新窗口中顯示庫函數(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ù)初始
21、化所需要傳遞給庫函數(shù)的域值。如s.p1=478; s.p2=-299; 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會自動轉(zhuǎn)化數(shù)據(jù)類型。指定結(jié)構(gòu)體域名下面是在為外部庫函數(shù)傳遞結(jié)構(gòu)體數(shù)據(jù)時(shí)一般的做法:1.結(jié)構(gòu)體數(shù)據(jù)可能只包含了定義中很少的一部分域,MATLAB會把其余的域初始化為0.2.你所使用的任何結(jié)構(gòu)體的域名須與定義中的域名一致。3.結(jié)構(gòu)體中不能包含庫函數(shù)中未定義過的域名。傳遞MATLAB結(jié)構(gòu)體與其他的數(shù)據(jù)類型一樣,當(dāng)外部函數(shù)接受結(jié)構(gòu)體變量數(shù)
22、據(jù)類型時(shí),就可以傳遞一個(gè)MATLAB型結(jié)構(gòu)體數(shù)據(jù)給它。結(jié)構(gòu)體的域名必須與庫函數(shù)定義中的域名一致,而數(shù)值類型則可以不同,由MATLAB自動轉(zhuǎn)換完成。如shrlibsample共享庫中定義了這樣的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定義中的不一樣,但域
23、外必須相同,否則傳遞不進(jìn)去:sm.p1=476; sm.p2=-299; sm.p3=1000;calllib(shrlibsample, addStructFields, sm )ans= 1177傳遞結(jié)構(gòu)體對象當(dāng)為外部函數(shù)傳遞結(jié)構(gòu)體變量時(shí),MATLAB為了確保傳遞成功,要求域名必須與庫函數(shù)定義中的一致,而對數(shù)值類型則不加強(qiáng)求,由MATLAB自動轉(zhuǎn)換成庫函數(shù)中對應(yīng)域的數(shù)值類型,并且把空域的值均初始化為零。當(dāng)結(jié)構(gòu)體數(shù)據(jù)較小時(shí),這種做法很有效。然而,當(dāng)重復(fù)傳遞一個(gè)或多個(gè)大的結(jié)構(gòu)體數(shù)據(jù)時(shí),手動轉(zhuǎn)化是更明智的選擇,不僅可以節(jié)省時(shí)間,還可以節(jié)省內(nèi)存和空間。使用libstruct函數(shù)s=libstruc
24、t (structtype, mlstruct)返回值s叫做libstruct對象。雖然它實(shí)際上是MATLAB的一個(gè)對象,但它更象是一個(gè)結(jié)構(gòu)體數(shù)據(jù)。這個(gè)新的所謂“結(jié)構(gòu)體”的域名得自于外部庫函數(shù)中結(jié)構(gòu)體的域名。例如,把MATLAB結(jié)構(gòu)體sm轉(zhuǎn)換成libstruct對象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對象的域名則與c_struct結(jié)構(gòu)體一致,分別為double、short和long型。創(chuàng)建空libstruct對象s=libstru
25、ct (structtype)這種調(diào)用格式可以生成域名完整,域值為0的空libstruct對象。使用結(jié)構(gòu)體作為對象libstruct轉(zhuǎn)換后的結(jié)構(gòu)體實(shí)際上是lib.c_struct類中的一個(gè)對象實(shí)例,這一點(diǎn)可以通過whos命令的輸出來驗(yàn)證:whos scName Size Bytes Classsc 1-by-1 lib.c_structGrand total is 1 element using 0 bytes域已經(jīng)被當(dāng)成了lib.c_struct類的屬性來處理了。你可以利用基于對象的函數(shù)set和get來讀寫:sc=libstruct ( c_struct );set (sc, p1,100,
26、 p2, 150, p3, 200 ); %對象讀寫須用get、setget(sc) p1:100 p2:150 p3:200但是你也可以象處理結(jié)構(gòu)體數(shù)據(jù)那樣簡單地對sc進(jìn)行讀寫:sc.p1=23; %而結(jié)構(gòu)體的域可以直接賦值sc.p1ans= 23創(chuàng)建形參你可以為外部函數(shù)按值傳遞大多數(shù)的變量,即使函數(shù)原型要求形參傳遞,然而有時(shí)你會發(fā)現(xiàn)這與直接給C傳遞形參一樣揍效。使用庫指針函數(shù)用函數(shù)libpointer構(gòu)造一個(gè)形參的語法如下:p=libpointer(type, value)例如要?jiǎng)?chuàng)建一個(gè)指向int16數(shù)據(jù)類型的指針pv,就得先指定指針的類型,并以Ptr作后綴:v=int16(485);pv
27、=libpointer(int16Prt, v);返回值pv實(shí)際就是MATLAB中l(wèi)ib.pointer類的一個(gè)實(shí)例。lib.pointer有屬性值和數(shù)據(jù)類型。你可以用get或set函數(shù)來讀或?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è)簡單的例子可以說明。函數(shù)multDoubleRef接受
28、一個(gè)雙精度形參同時(shí)返回雙精度型。double *multDoubleRef(double *x) *x *=5; return x;輸入數(shù)據(jù)x來創(chuàng)建一個(gè)形參xp: x=15; xp=libpointer(doublePtr,x); get(xp) value:15 Datatype:doublePtr現(xiàn)在可以調(diào)用函數(shù)來檢驗(yàn)結(jié)果:calllib(shrlibsample, multDoubleRef, xp);get(xp, value)ans= 75注意:xp雖然是作為x的形參而創(chuàng)建的,但它并非真的象C語言的指針,因?yàn)閤p中并不包含x的地址,因此,當(dāng)函數(shù)執(zhí)行時(shí),函數(shù)修改xp的屬性值,但它并不修
29、改x的值。獲得函數(shù)的返回值在上述最后一例子中,從MATLAB調(diào)用的函數(shù)返回值可以通過檢查修改了的輸入形參來獲得,但這個(gè)函數(shù)也可以通過輸出變量來獲得。這個(gè)函數(shù)的MATLAB原型表明(利用libfunctions shrlibsample full查看原型),它返回了兩個(gè)輸出變量,一為lib.pointer類的對象,另一為dlublePtr輸入變量的屬性值:libfunctions shrlibsample fulllib.pointer, doublePtr multDoubleRef (doublePtr)再次運(yùn)行這個(gè)例程,但這次檢查返回值x=15;xp=libpointer( doubleP
30、tr, x);xobj, xval=calllib(shrlibsample, multDoubleRef, xp)xobj= lib.pointerxval= 75創(chuàng)建結(jié)構(gòu)體形參與創(chuàng)建原始類型的形參相比,創(chuàng)建結(jié)構(gòu)體的形參并非難事。下述函數(shù)只接受C語言形式的結(jié)構(gòu)體形參,它的返回值是所有結(jié)構(gòu)體域值之和,同時(shí)也修改了輸入?yún)⒘?。double addStructByRef( struct c_struct *st ) double t=st-p1+st-p2+st-p3; st-p1=5.5; st-p2=1234; st-p3=12345678; return t;(1)傳遞結(jié)構(gòu)體本身雖然這個(gè)函數(shù)期
31、望獲得一個(gè)結(jié)構(gòu)體的輸入?yún)⒘?。下列給形參傳遞了一個(gè)MATLAB的結(jié)構(gòu)體sm,返回值是正確的,因?yàn)閟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)變量超
32、過一層引用(例如,uint16 *)就是這里提到的形參指針。在MATLAB中,這類變量類型都加以后綴PtrPtr。當(dāng)調(diào)用一個(gè)接受形參指針的函數(shù)時(shí),你可以使用一個(gè)形參變量代替,MATLAB將會把該形參變量轉(zhuǎn)換為形參指針。例如,外部函數(shù)allocateStruct接受一個(gè)c_structPtrPtr變量:libfunctions shrlibsample full c_structPtrPtr allocateStruct(c_structPrtPtr)C語言編寫的該函數(shù):void allocateStruct (struct c_struct *val) *val=(struct c_struc
33、t *) malloc(sizeof(sturct c_struct); (*val)-p1=12.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-by-1 struct DataType:c_st
34、ructPtrget(sp, value)ans= p1:12.4000 p2:222 p3:333333完成之后,記得從內(nèi)存中刪除該對象以釋放空間:calllib( shrlibsample, deallocateStruct, sp)MATLAB外部接口你可以在MATLAB中調(diào)用自己編寫的C函數(shù),MATLAB會讓你感覺就象調(diào)用MATLAB自身內(nèi)建函數(shù)一樣輕松。MATLAB中可以調(diào)用的C函數(shù)就是MEX文件,MEX文件是MATLAB解釋器能自動加載和執(zhí)行的子程序。MEX文件有幾個(gè)應(yīng)用:1.不必為調(diào)用大型C程序而把它改寫成MATLAB默認(rèn)的M文件。2.解決計(jì)算的一些瓶頸問題,在MATLAB中做一
35、些循環(huán)計(jì)算時(shí)效率不如C語言。MEX文件不適合所有的應(yīng)用,MATLAB是一個(gè)高效率的系統(tǒng),與C和Fortan編譯相比,它能有效降低耗時(shí)。一般多數(shù)編程MATLAB均能解決,因此除非你的應(yīng)用程序確實(shí)需要MEX文件,否則不必使用MEX文件。使用MEX文件MEX文件是C或Fortran代碼的子程序,它的運(yùn)行就象M文件和內(nèi)建函數(shù)。MATLAB識別MEX文件是根據(jù)不同操作平臺文件的擴(kuò)展名,而M文件的擴(kuò)展名(.m)與操作平臺無關(guān)。不如操作系統(tǒng)下MEX文件的擴(kuò)展名如下:操作系統(tǒng)平臺MEX文件擴(kuò)展名HP-UXmexhpuxLinuxmexglxMacintoshmexmacSolarismexsolWindows
36、dll你可以準(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í)行。如果在同一目錄上有相同文件名的MEX文件(.dll-以windows平臺為例)和M文件(.m),則MEX文件優(yōu)先,而幫助文檔仍然從.m文件中讀取。前綴mx與mex的差別API的程序以mx為前綴,允許你創(chuàng)建、訪問、操作和銷毀mxArr
37、ays,前綴mex的程序在MATLAB的后臺工作。例如mexEvalString子程序就工作在MATLAB的工作空間對字符串運(yùn)算。為了操作MATLAB的矩陣,矩陣訪問和創(chuàng)建庫提供一套子程序,這些子程序以mx前綴開頭,它們的完整文檔于在線參考網(wǎng)頁上能找到。例如,mxGetPi函數(shù)從矩陣內(nèi)取回虛數(shù)的指針。雖然訪問、創(chuàng)建矩陣的子程序允許操縱MATLAB矩陣,但有兩種情況例外,IEEE程序和內(nèi)存管理程序。例如,mxGetNaN返回一雙精度數(shù)據(jù),而非mxArray型。MATLAB數(shù)據(jù)在你開始編制MEX文件之前,必須先了解MATLAB支持的數(shù)據(jù)類型。1.矩陣MATLAB只用唯一的對象類型數(shù)據(jù)-MATLAB
38、矩陣。所有的MATLAB變量,包括標(biāo)量、矢量、矩陣、字符串、元胞矩陣、結(jié)構(gòu)體及對象,它們都是存儲在MATLAB矩陣?yán)铩?yīng)C語言中,MATLAB矩陣應(yīng)聲明為mxArray型,mxArray型數(shù)據(jù)中包括了矩陣的類型、維數(shù)、相關(guān)數(shù)據(jù)等。如果是數(shù)值變量,它還包括該變量是實(shí)數(shù)還是復(fù)數(shù)的信息,如果是稀疏矩陣,它還記錄下標(biāo)和非零的元素個(gè)數(shù),如果是結(jié)構(gòu)體或?qū)ο?,它還包括域的個(gè)數(shù)和域名。2.數(shù)據(jù)存儲MATLAB中的數(shù)據(jù)是按列存儲,與Fortran相同,之所以采用這種習(xí)慣,是緣于MATLAB最初是用Fortran語言編寫的。例如矩陣a=house; floor; porcha= house floor porc
39、hsize(a)ans= 3 5數(shù)據(jù)存儲為hfpolouorsocerh3.復(fù)數(shù)復(fù)數(shù)在MATLAB中是最普遍的雙精度類型,一個(gè)m-by-n的矩陣它的實(shí)部和虛部分別存放在m-by-n大小的矩陣中,其中m表示矩陣的行數(shù),n表示矩陣的列數(shù)。這兩個(gè)矩陣獨(dú)立時(shí)由兩個(gè)指向?qū)崝?shù)和虛數(shù)的指針pr、pi指著,如果是實(shí)數(shù)(如單精度的浮點(diǎn)數(shù),無符號和有符號的8、16、32位整數(shù)),則虛部的指針為NULL。4.邏輯矩陣5.MATLAB字符串 MATLAB字符串是字符類型,它的存儲方式與16位整數(shù)一樣,只是沒有虛部分量。與C不同的是,MATLAB字符串不以NULL結(jié)束。6.元胞矩陣7.稀疏矩陣稀疏矩陣的存儲習(xí)慣與滿置矩
40、陣不同,除了指向?qū)嵅亢吞摬康闹羔榩r、pi外,還有三個(gè)參數(shù)nzmax、ir和jc:nzmax 為一整數(shù),它包括ir、pr的長度,如果有虛部的話,也包括pi的長度,它表示稀疏矩陣中不為零的元素的最大的個(gè)數(shù)。ir 是一長度為nzmax的整數(shù)矩陣,它包含了pr和pi指針中相應(yīng)元素的行下標(biāo)。jc是一長度為N+1的整數(shù)矩陣,它包含了元素列的信息。j的變化范圍是0=ja1,1ans =cellclassa1,2ans = 1 2 2a2,:ans =abcans = 9 5 6 b=a1,1b =cellclass元胞數(shù)組:元胞數(shù)組是MATLAB的一種特殊數(shù)據(jù)類型,可以將元胞數(shù)組看做一種無所不包的通用矩陣
41、,或者叫做廣義矩陣。組成元胞數(shù)組的元素可以是任何一種數(shù)據(jù)類型的常數(shù)或者常量,每一個(gè)元素也可以具有不同的尺寸和內(nèi)存占用空間,每一個(gè)元素的內(nèi)容也可以完全不同,所以元胞數(shù)組的元素叫做元胞(cell)。和一般的數(shù)值矩陣一樣,元胞數(shù)組的內(nèi)存空間也是動態(tài)分配的。(1)元胞數(shù)組的創(chuàng)建 a=matlab,20;ones(2,3),1:10a = matlab 20 2x3 double 1x10 double b=matlab,20;ones(2,3),1:10b = matlab 20 2x3 double 1x10 double c=10c = 10c(1,2)=2c = 10 2c(2,2)=5c =
42、10 2 5isequal(a,b)ans = 1whosName Size Bytes Class Attributesa 2x2 388 cell ans 1x1 1 logical b 2x2 388 cell c 2x2 208 cell 用cell函數(shù)創(chuàng)建元胞數(shù)組,創(chuàng)建的數(shù)組為空元胞。cell函數(shù)創(chuàng)建空元胞數(shù)組的主要目的是為數(shù)組預(yù)先分配連續(xù)的存儲空間,節(jié)約內(nèi)存占用,提高執(zhí)行效率。 a=cell(1)a = b=cell(1,2)b = c=cell(3,3)c = d=cell(2,2,2)d(:,:,1) = d(:,:,2) = whosName Size Bytes Class
43、 Attributesa 1x1 4 cell ans 1x1 1 logical b 1x2 8 cell c 3x3 36 cell d 2x2x2 32 cell (2)元胞數(shù)組的數(shù)據(jù)獲得從元胞數(shù)組中讀取數(shù)據(jù),可保存為一個(gè)標(biāo)準(zhǔn)的數(shù)組或一個(gè)新的單元數(shù)組,或取出數(shù)組進(jìn)行計(jì)算。元胞數(shù)組中數(shù)據(jù)的訪問,可通過元胞內(nèi)容的下標(biāo)進(jìn)行,用元胞數(shù)組名加大括號。大括號中數(shù)值表示元胞的下標(biāo)。如a1,2表示元胞數(shù)組中第一行第二列的元胞。 a=20,matlab;ones(2,3),1:3a = 20 matlab 2x3 double 1x3 doublestr=a(1,2)str = matlabclass(s
44、tr)ans =cellstr=a1,2str =matlabclass(str)ans =char()和有著本質(zhì)的區(qū)別,大括號用于表示元胞的內(nèi)容,小括號表示指定的元胞。a = 20 matlab 2x3 double 1x3 doublea2,1(2,2)ans = 0.9134a2,1(2,3)ans = 0.0975a1,2(2)ans =a使用元胞的下標(biāo),可將一個(gè)元胞數(shù)組的子集賦值給另一個(gè)變量,創(chuàng)建新的元胞數(shù)組。 a=1,2,3;4,5,6;7,8,9a = 1 2 3 4 5 6 7 8 9 b=a(2:3,2:3)b = 5 6 8 9 c=a(1:3,2:3)c = 2 3 5
45、6 8 9本例使用元胞下標(biāo)的方式創(chuàng)建了新的元胞數(shù)組b和c,通過結(jié)果看出b和c就是元胞數(shù)組a的一部分。(3)元胞數(shù)組的刪除和重塑要?jiǎng)h除單元數(shù)組中的行或列,可以用冒號表示單元數(shù)組中的行或列,然后對其賦一個(gè)空矩陣即可。a=20,matlab;ones(2,3),1:3a = 20 matlab 2x3 double 1x3 doublea(1,:)=a = 2x3 double 1x3 double a=20,matlab;ones(2,3),1:3;a1=a = matlab 2x3 double 1x3 doublea(1)=a = 2x3 double matlab 1x3 doublea(2
46、)=a = 2x3 double 1x3 doublea(1,2)=? A null assignment can have only one non-colon index.a(1)=a = 1x3 double元寶數(shù)組和其他數(shù)組一樣,也可以通過reshape函數(shù)改變形狀,改變后的元胞數(shù)組與原元胞數(shù)組的元素個(gè)數(shù)相同,不能通過改變形狀來添加或刪除元胞數(shù)組中的元素。 a=cell(4,4)a = size(a)ans = 4 4 b=reshape(a,2,8)b = size(b)ans = 2 8(5)元胞數(shù)組中的操作函數(shù) cell:創(chuàng)建空的元胞數(shù)組cellfun:為元胞數(shù)組的每個(gè)元胞執(zhí)行指定的函數(shù)celldisp:顯示所有元胞的內(nèi)容cellplot:利用圖形方式顯示元胞數(shù)組 cell2mat:將元胞數(shù)組轉(zhuǎn)變成為普通的矩陣 mat2cell:將數(shù)值矩陣轉(zhuǎn)變成為元胞數(shù)組 num2cell:將數(shù)值數(shù)組轉(zhuǎn)變成為元胞數(shù)組 deal:將輸入?yún)?shù)賦值給輸出 cell2struct:將元胞數(shù)組轉(zhuǎn)變成為結(jié)構(gòu) struct2
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年高仿真化學(xué)纖維項(xiàng)目可行性研究報(bào)告
- 2025年中國輪胎制造行業(yè)市場深度評估及投資戰(zhàn)略規(guī)劃報(bào)告
- 2025年全套機(jī)械零部件項(xiàng)目投資可行性研究分析報(bào)告
- 電子測量儀器項(xiàng)目安全評估報(bào)告
- 中國PC飲用水桶行業(yè)市場深度研究及發(fā)展趨勢預(yù)測報(bào)告
- 裝飾別墅合同范本
- 中國純電動專用車行業(yè)發(fā)展監(jiān)測及投資戰(zhàn)略規(guī)劃研究報(bào)告
- 河南油料的種植市場前景及投資研究報(bào)告
- 輪胎供應(yīng)服務(wù)合同范本
- 房屋贈與協(xié)議書怎么寫
- 汽車美容裝潢技術(shù)電子教案 6.3-汽車娛樂類電子產(chǎn)品裝飾
- 防性侵安全教育課件
- 四川省會計(jì)師事務(wù)所服務(wù)收費(fèi)標(biāo)準(zhǔn)(川發(fā)改價(jià)格〔2013〕901號)
- 2024年注冊計(jì)量師-一級注冊計(jì)量師考試近5年真題集錦(頻考類試題)帶答案
- 《籃球:行進(jìn)間單手肩上投籃》教案(四篇)
- 醫(yī)學(xué)教案阿爾茨海默病及其他類型癡呆臨床路徑
- 中小學(xué)、幼兒園安全防范要求
- 農(nóng)村建房的鄰居協(xié)議書模板
- 《積極心理學(xué)(第3版)》 課件 01開篇 相對富裕的社會呼喚積極心理學(xué)
- 人教版版小學(xué)科學(xué)二年級下冊教案
- 反比例函數(shù)函數(shù)K的幾何意義市公開課一等獎(jiǎng)省賽課獲獎(jiǎng)?wù)n件
評論
0/150
提交評論