在MATLAB環(huán)境下訪問外部函數(shù)的共享庫文件_第1頁
在MATLAB環(huán)境下訪問外部函數(shù)的共享庫文件_第2頁
在MATLAB環(huán)境下訪問外部函數(shù)的共享庫文件_第3頁
在MATLAB環(huán)境下訪問外部函數(shù)的共享庫文件_第4頁
在MATLAB環(huán)境下訪問外部函數(shù)的共享庫文件_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

在MATLAB環(huán)境下訪問外部函數(shù)的共享庫文件在MATLAB環(huán)境下訪問外部函數(shù)的共享庫文件,必須首先把該庫文件加載到內(nèi)存中。一旦加載成功,就能直接在MATLAB中直接請求關(guān)于函數(shù)的任何信息。而當(dāng)不再需要該庫時,就應(yīng)當(dāng)及時把庫文件從內(nèi)存中卸載以節(jié)省內(nèi)存開銷。加載庫語法:loadlibrary(‘shrlib’,’hfile’)其中shrlib為加載的動態(tài)鏈接庫文件名(filename.dll),hfile為頭文件名,它包含函數(shù)原型。例如,當(dāng)加載包含MATLAB中mx程序的libmx庫時,可以使用下列語句。hfile=[matlabroot’\extern\include\matrix.h’];loadlibray(‘libmx’,hfile)卸載庫語法:unloadlibrarylibmx使用兩個函數(shù)可以獲取加載庫的信息:libfunctions(‘libname’)orlibfunctionslibnamelibfunctionsview(‘libname’)orlibfunctionsviewlibname這兩個函數(shù)的不同之處在于顯示結(jié)果的方式不同,后者是以圖形的方式顯示在新的窗口中。而前者返回庫libmx中有哪些可用的函數(shù)。請看示例:libfunctionslibmxMethodsforclasslib.libmx:mxAddField mxGetFieldNumber mxIsLogicalScalarTruemxArrayToString mxGetImagData mxIsNaNmxCalcSingleSubscript mxGetInf mxIsNumericmxCalloc mxGetIr mxIsObjectmxClearScalarDoubleFlag mxGetJc mxIsOpaquemxCreateCellArray mxGetLogicals mxIsScalarDoubleFlagSet如果加上命令開頭-full,則可以顯示函數(shù)返回值的細節(jié)。libfunctionslibmx-fullMethodsforclasslib.libmx:[mxClassID,MATLABarray]mxGetClassID(MATLABarray)[lib.pointer,MATLABarray]mxGetData(MATLABarray)[MATLABarray,voidPtr]mxSetData(MATLABarray,voidPtr)[lib.pointer,MATLABarray]mxGetPr(MATLABarray)[MATLABarray,doublePtr]mxSetPr(MATLABarray,doublePtr)uint8mxIsFinite(double)uint8mxIsInf(double)值得注意的是,這兩個函數(shù)返回值的類型均是MATLAB的數(shù)據(jù)類型,雖然函數(shù)是利用C語言編寫的。調(diào)用庫函數(shù)一旦庫函數(shù)被加載到了內(nèi)存空間,只要指定庫名、函數(shù)名和變量就可以使用calllib函數(shù)調(diào)用庫中的任何函數(shù)了。語法格式:calllib(‘libname’,’funcname’,arg1,…,argn)下列語句顯示如何操作:hfile=['C:\MATLAB7\extern\include\matrix.h'];loadlibrary(‘libmx’,hfile);y=rand(4,7,2);%producea3Darray,thereare56elementsinitcalllib(‘libmx’,’mxGetNumberOfElements’,y)ans=56Calllib(‘libmx’,’mxGetClassID’,y)ans=mxDouble_CLASS傳遞變量當(dāng)調(diào)用外部庫里的函數(shù)時,該為函數(shù)提供哪種類型的變量呢?MATLAB的extern\examples\shrlib\shrlibsample庫里對每一種特殊的變量類型都作出了說明。但我們首先必須把該庫文件的路徑添加到MATLAB的搜索路徑中來,或者使該庫文件所在的目錄成為當(dāng)前目錄,兩種做法的命令如下。addpath(‘C:\MATLAB7\extern\examples\shrlib’)cd(‘C:\MATLAB7\extern\examples\shrlib’)下面的例子就是加載該庫并顯示了其中的一些函數(shù)。loadlibraryshrlibsampleshrlibsample.hlibfunctionsshrlibsample–full執(zhí)行上述兩行后,返回:Functionsinlibraryshrlibsample:[double,doublePtr]addDoubleRef(double,doublePtr,double)doubleaddMixedTypes(int16,int32,double)[double,c_structPtr]addStructByRef(c_structPtr)doubleaddStructFields(c_struct)c_structPtrPtrallocateStruct(c_structPtrPtr)voidPtrdeallocateStruct(voidPtr)doublePtrmultDoubleArray(doublePtr,int32)[lib.pointer,doublePtr]multDoubleRef(doublePtr)int16PtrmultiplyShort(int16Ptr,int32)stringreadEnum(Enum1)[string,string]stringToUpper(string)這里所有的函數(shù)都是用C語言編寫的。一些通用的規(guī)則在函數(shù)的輸入輸出變量問題上,以下幾點應(yīng)注意:1.許多變量類型,象int32、double與C語言的數(shù)據(jù)類型非常相象。這些變量只需要傳遞MATLAB型的數(shù)據(jù)就可以了。2.而有些C語言的變量類型,象**double、還有預(yù)定義型與標(biāo)準MATLAB數(shù)據(jù)類型是完全不同的。這種情況下,有兩種選擇,要么給外部函數(shù)的入?yún)鬟f標(biāo)準的MATLAB數(shù)據(jù)類型,讓MATLAB程序自動轉(zhuǎn)化,要么先使用MATLAB提供的轉(zhuǎn)化函數(shù),如libstruct、libpointer自己轉(zhuǎn)化。關(guān)于轉(zhuǎn)化,可以參考DataConversion。3.C語言通常可以按形參傳遞變量,但MATLAB不支持這種做法,不過可以創(chuàng)造MATLABPtr或PtrPtr型的變量,去兼容C語言的形參。4.C語言通常還可以通過形參來返回輸入變量的值,而MATLAB需要額外的變量來獲得返回值。傳遞變量的通用規(guī)則1.庫函數(shù)傳遞形參時,標(biāo)量不必非得聲明。2.如果庫函數(shù)使用單下標(biāo)來引用二維矩陣元素時,請記住,C語言是逐行處理矩陣元素,而MATLAB是按列優(yōu)先處理的。因此迎合C語言的習(xí)慣,可以在給MATLAB函數(shù)傳遞變量之前把矩陣進行轉(zhuǎn)置,從函數(shù)返回后再轉(zhuǎn)置回來就行了。3.由上可知,當(dāng)傳遞的矩陣超過二維時,MATLAB會改變矩陣的行列結(jié)構(gòu),為了確保矩陣的結(jié)構(gòu)不被破壞,可以事先記錄矩陣的結(jié)構(gòu),在調(diào)用結(jié)束后利用reshape函數(shù)還原即可。例如:vs=size(vin);%supposethedimentionofvectorvinis2-by-5-by2vout=calllib(‘shrlibsample’,’multDoubleArray’,vin,20);%dimentionhavebeenalteredans=210vout=reshape(vout,vs);%Restorethearrayto2-by-5-by-2size(vout)ans=2524.當(dāng)支持可選參數(shù)時,可用一空矩陣來傳遞一個NULL型參數(shù)。這是在變量為Ptr或PtrPtr型時唯一的選擇。傳參外部庫的許多函數(shù)是傳遞形參的,為了能與這些函數(shù)交互,MATLAB通常傳遞一個叫“指針對象”的變量,不過別把它與傳參混同了。數(shù)據(jù)轉(zhuǎn)化在多數(shù)情況下,傳遞給外部庫函數(shù)或從外部庫函數(shù)返回的數(shù)據(jù)類型自動被MATLAB轉(zhuǎn)化,然而,或許你偶爾也希望有些時侯能手動轉(zhuǎn)化:1.當(dāng)需要傳遞相同的數(shù)據(jù)給一系列庫函數(shù)時,可能手動轉(zhuǎn)化要比讓MATLAB自動轉(zhuǎn)化更為明智,更能節(jié)省時間。2.當(dāng)傳遞大結(jié)構(gòu)的數(shù)據(jù)時,手動轉(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**)時,用libpointer函數(shù)構(gòu)造一個參數(shù),比直接讓MATLAB自動轉(zhuǎn)化數(shù)據(jù)要好。原始類型共享庫接口支持所有標(biāo)準C數(shù)據(jù)類型。下表顯示了C與MATLAB等價的數(shù)據(jù)類型。C類型(32位機器)等價MATLAB類型char,byteint8unsignedchar,byteuint8shortint16unsignedshortuint16int,longint32unsignedint,unsignedlonguint32floatsingledoubledoublechar*string(1-by-nchararray)下表顯示的lib.pointer類中的數(shù)據(jù)類型,非MATLAB標(biāo)準類型C數(shù)據(jù)類型(32位機器)擴展MATLAB數(shù)據(jù)類型integerpointertypes(int*)(u)int(size)Ptrfloat*singlePtrdouble*doublePtrmxArray*MATLABarrayvoid*voidPtrtype**sameastypePtrwithanaddedPtr(e.g.,double**isdoublePtrPtr)MATLAB可以自動把轉(zhuǎn)化數(shù)據(jù)為外部庫函數(shù)所需要的任何原型數(shù)據(jù),這就意味著可以傳遞一個雙精度型數(shù)據(jù)給一個8位整數(shù)型變量。下述C函數(shù)接受短整型、整型和雙精度型數(shù)據(jù):doubleaddMixedTypes(shortx,inty,doublez){return(x+y+z);}你可以極其簡單地在MATLAB中只傳遞給該函數(shù)以雙精度變量,MATLAB自動判斷每個變量接受何種類型的變量,并作近似轉(zhuǎn)化。calllib(‘shrlibsample’,’addMixedTypes’,127,33000,pi)ans=3.3130e+004轉(zhuǎn)化參數(shù)當(dāng)外部函數(shù)原型定義一個形參時,MATLAB能自動地把一個按值傳遞的變量轉(zhuǎn)化為形參。因此,當(dāng)給一個雙精度指針變量賦一雙精度變量時,MATLAB會自動地把該雙精度變量轉(zhuǎn)化為雙精度形參。addDoubleRef是一個接受雙精度指針型形參的函數(shù):doubleaddDoubleRef(doublex,bouble*y,doublez){return(x+*y+z);}用三個雙精度變量調(diào)用該函數(shù),MATLAB自動處理數(shù)據(jù)轉(zhuǎn)化:calllib(‘shrlibsample’,‘a(chǎn)ddDoubleRef’,1.78,5.42,13.3)ans=20.5000字符串當(dāng)變量需要字符型指針數(shù)據(jù)時,你可以傳遞一個MATLAB型字符串(矩陣)。下述C函數(shù)接受一個字符指針型數(shù)據(jù):char*stringToUpper(char*input){char*p=input;if(p!=NULL)while(*p!=0)*p++=toupper(*p);returninput;}libfunctions顯示,你可以用一個MATLAB字符串作為輸入。libfunctionsshrlibsample–full[string,string]stringToUpper(string)定義一個MATLAB字符矩陣str,把它傳遞給變量。str=’ThiswasaMixedCasestring’;%MATLAB中字符串以“’”號對表示calllib(‘shrlibsample’,‘stringToUpper’,str)ans=THISWASAMIXEDSTRING注意:雖然MATLAB傳遞給變量的很象字符型的形參,但它并不真正的參數(shù)類型。因為它并不包括MATLAB字符矩陣str的地址。因此當(dāng)函數(shù)執(zhí)行完畢時,字符串的值并未改變。枚舉型如果變量被定義為C中的枚舉型,你可以傳遞枚舉型或一個與枚舉值等價的整數(shù)。shrlibsample庫中的readEnum函數(shù)返回與傳入變量相應(yīng)的枚舉型。下述為Enum1的定義和C語言函數(shù)readEnum:enumEnum1{en1=1,en2,en4=4}TEnum1;char*readEnum(TEnum1val){switch(val){case1:return“youchoseen1”;case2:return“youchoseen2”;case4:return“youchoseen4”;default:return“enumnotdefined”;}}MATLAB,你可以用一個枚舉型字符或等價的整數(shù)來表示枚舉型數(shù)據(jù)。上述中定義的枚舉型數(shù)據(jù)TEnum1中,en4與4等價:calllib(‘shrlibsample’,‘readEnum’,‘en4’)ans=youchoseen4calllib(‘shrlibsampel’,‘readEnum’,4)ans=youchoseen4結(jié)構(gòu)體型當(dāng)庫函數(shù)接受結(jié)構(gòu)體型變量時,你需要給它傳遞與在結(jié)構(gòu)體定義時擁有相同域名的結(jié)構(gòu)體變量。為了確定結(jié)構(gòu)體變量的域和類型,你可以:1.查詢庫文檔2.在加載到MATLAB的庫的頭文件中尋找結(jié)構(gòu)體的定義。你也可以在MATLAB中采用下述步驟來確定外部函數(shù)定義過的結(jié)構(gòu)體的域名。1.利用libfunctionsview函數(shù)來顯示正在使用的庫函數(shù)的信息,它包含了每一個函數(shù)所做用的結(jié)構(gòu)體數(shù)據(jù)的名字。當(dāng)鍵入libfunctionsviewshrlibsample命令時,MATLAB就會在新窗口中顯示庫函數(shù)的信息。如:doubleaddStructFields(c_struct)2.利用libstruct函數(shù)獲取結(jié)構(gòu)體定義模型。如s=libstruct(‘c_struct’);3.繼而利用get函數(shù)返回結(jié)構(gòu)體數(shù)據(jù)的域名。如get(s)p1:0p2:0p3:04.利用calllib函數(shù)初始化所需要傳遞給庫函數(shù)的域值。如s.p1=478;s.p2=-299;s.p3=1000;calllib(‘shrlibsample’,‘a(chǎn)ddStructFields’,s)當(dāng)你利用calllib函數(shù)創(chuàng)建或初始化結(jié)構(gòu)體數(shù)據(jù)時,不必去匹配結(jié)構(gòu)體的數(shù)據(jù)域,MATLAB會自動轉(zhuǎn)化數(shù)據(jù)類型。指定結(jié)構(gòu)體域名下面是在為外部庫函數(shù)傳遞結(jié)構(gòu)體數(shù)據(jù)時一般的做法: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ù)據(jù)類型時,就可以傳遞一個MATLAB型結(jié)構(gòu)體數(shù)據(jù)給它。結(jié)構(gòu)體的域名必須與庫函數(shù)定義中的域名一致,而數(shù)值類型則可以不同,由MATLAB自動轉(zhuǎn)換完成。如shrlibsample共享庫中定義了這樣的C結(jié)構(gòu)和函數(shù):structc_struct{doublep1;shortp2;longp3;};doubleaddStructField(structc_structst){doublet=st.p1+st.p2+st.p3;returnt;}下面的代碼完成向addStructField函數(shù)傳遞一個結(jié)構(gòu)體變量sm,包含三個雙精度數(shù)據(jù),即傳遞的數(shù)值類型與C定義中的不一樣,但域外必須相同,否則傳遞不進去:sm.p1=476;sm.p2=-299;sm.p3=1000;calllib(‘shrlibsample’,‘a(chǎn)ddStructFields’,sm)ans=1177傳遞結(jié)構(gòu)體對象當(dāng)為外部函數(shù)傳遞結(jié)構(gòu)體變量時,MATLAB為了確保傳遞成功,要求域名必須與庫函數(shù)定義中的一致,而對數(shù)值類型則不加強求,由MATLAB自動轉(zhuǎn)換成庫函數(shù)中對應(yīng)域的數(shù)值類型,并且把空域的值均初始化為零。當(dāng)結(jié)構(gòu)體數(shù)據(jù)較小時,這種做法很有效。然而,當(dāng)重復(fù)傳遞一個或多個大的結(jié)構(gòu)體數(shù)據(jù)時,手動轉(zhuǎn)化是更明智的選擇,不僅可以節(jié)省時間,還可以節(jié)省內(nèi)存和空間。使用libstruct函數(shù)s=libstruct(‘structtype’,mlstruct)返回值s叫做libstruct對象。雖然它實際上是MATLAB的一個對象,但它更象是一個結(jié)構(gòu)體數(shù)據(jù)。這個新的所謂“結(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)中域值為三個雙精度型,而libstruct函數(shù)轉(zhuǎn)換后的sc對象的域名則與c_struct結(jié)構(gòu)體一致,分別為double、short和long型。創(chuàng)建空libstruct對象s=libstruct(‘structtype’)這種調(diào)用格式可以生成域名完整,域值為0的空libstruct對象。使用結(jié)構(gòu)體作為對象libstruct轉(zhuǎn)換后的結(jié)構(gòu)體實際上是lib.c_struct類中的一個對象實例,這一點可以通過whos命令的輸出來驗證:whosscNameSizeBytesClasssc1-by-1lib.c_structGrandtotalis1elementusing0bytes域已經(jīng)被當(dāng)成了lib.c_struct類的屬性來處理了。你可以利用基于對象的函數(shù)set和get來讀寫:sc=libstruct(‘c_struct’);set(sc,‘p1’,100,‘p2’,150,‘p3’,200);%對象讀寫須用get、setget(sc)p1:100p2:150p3:200但是你也可以象處理結(jié)構(gòu)體數(shù)據(jù)那樣簡單地對sc進行讀寫:sc.p1=23;%而結(jié)構(gòu)體的域可以直接賦值sc.p1ans=23創(chuàng)建形參你可以為外部函數(shù)按值傳遞大多數(shù)的變量,即使函數(shù)原型要求形參傳遞,然而有時你會發(fā)現(xiàn)這與直接給C傳遞形參一樣揍效。使用庫指針函數(shù)用函數(shù)libpointer構(gòu)造一個形參的語法如下:p=libpointer(‘type’,‘value’)例如要創(chuàng)建一個指向int16數(shù)據(jù)類型的指針pv,就得先指定指針的類型,并以Ptr作后綴:v=int16(485);pv=libpointer(‘int16Prt’,v);返回值pv實際就是MATLAB中l(wèi)ib.pointer類的一個實例。lib.pointer有屬性值和數(shù)據(jù)類型。你可以用get或set函數(shù)來讀或?qū)戇@些屬性。get(pv)value:485DataType:’int16Ptr’lib.pointer類還有另外兩種方法setdatatype和reshape。methods(pv)methodsforclasslib.pointer:setdatatypereshape為原始類型創(chuàng)建形參如何去創(chuàng)建和傳遞指針給雙精度型,又如何輸出數(shù)據(jù)這里有一個簡單的例子可以說明。函數(shù)multDoubleRef接受一個雙精度形參同時返回雙精度型。double*multDoubleRef(double*x){*x*=5;returnx;}輸入數(shù)據(jù)x來創(chuàng)建一個形參xp:x=15;xp=libpointer(‘doublePtr’,x);get(xp)value:15Datatype:’doublePtr’現(xiàn)在可以調(diào)用函數(shù)來檢驗結(jié)果:calllib(‘shrlibsample’,‘multDoubleRef’,xp);get(xp,‘value’)ans=75注意:xp雖然是作為x的形參而創(chuàng)建的,但它并非真的象C語言的指針,因為xp中并不包含x的地址,因此,當(dāng)函數(shù)執(zhí)行時,函數(shù)修改xp的屬性值,但它并不修改x的值。獲得函數(shù)的返回值在上述最后一例子中,從MATLAB調(diào)用的函數(shù)返回值可以通過檢查修改了的輸入形參來獲得,但這個函數(shù)也可以通過輸出變量來獲得。這個函數(shù)的MATLAB原型表明(利用libfunctionsshrlibsample–full查看原型),它返回了兩個輸出變量,一為lib.pointer類的對象,另一為dlublePtr輸入變量的屬性值:libfunctionsshrlibsample–full[lib.pointer,doublePtr]multDoubleRef(doublePtr)再次運行這個例程,但這次檢查返回值x=15;xp=libpointer(‘doublePtr’,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)體域值之和,同時也修改了輸入?yún)⒘?。doubleaddStructByRef(structc_struct*st){doublet=st->p1+st->p2+st->p3;st->p1=5.5;st->p2=1234;st->p3=12345678;returnt;}(1)傳遞結(jié)構(gòu)體本身雖然這個函數(shù)期望獲得一個結(jié)構(gòu)體的輸入?yún)⒘俊O铝薪o形參傳遞了一個MATLAB的結(jié)構(gòu)體sm,返回值是正確的,因為sm不是按址傳遞,所以sm的域值并未被函數(shù)修改。sm.p1=476;sm.p2=-299;sm.p3=1000;x=calllib(‘shrlibsample’,‘a(chǎn)ddStructByRef’,sm)x=1177(2)傳遞結(jié)構(gòu)體形參sp=libpointer(‘c_struct’,sm);calllib(‘shrlibsample’,‘a(chǎn)ddStructByRef’,sp)ans=1177get(sp,’value’)ans=p1:5.5000p2:1234p3:12345678形參指針當(dāng)變量超過一層引用(例如,uint16**)就是這里提到的形參指針。在MATLAB中,這類變量類型都加以后綴PtrPtr。當(dāng)調(diào)用一個接受形參指針的函數(shù)時,你可以使用一個形參變量代替,MATLAB將會把該形參變量轉(zhuǎn)換為形參指針。例如,外部函數(shù)allocateStruct接受一個c_structPtrPtr變量:libfunctionsshrlibsample–fullc_structPtrPtrallocateStruct(c_structPrtPtr)C語言編寫的該函數(shù):voidallocateStruct(structc_struct**val){*val=(structc_struct*)malloc(sizeof(sturctc_struct));(*val)->p1=12.4;(*val)->p2=222;(*val)->p3=333333;}該函數(shù)原型需要一個c_structPtrPtr型數(shù)據(jù),但你可以只傳遞一個c_structPtr型數(shù)據(jù),讓MATLAB完成第二層引用。下例創(chuàng)建了一個空的結(jié)構(gòu)體形參傳遞給allocateStruct函數(shù):sp=libpointer(‘c_structPtr’);calllib(‘shrlibsample’,‘a(chǎn)llocateStruct’,sp)get(sp)ans=value:[1-by-1struct]DataType:’c_structPtr’get(sp,‘value’)ans=p1:12.4000p2:222p3: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文件有幾個應(yīng)用:1.不必為調(diào)用大型C程序而把它改寫成MATLAB默認的M文件。2.解決計算的一些瓶頸問題,在MATLAB中做一些循環(huán)計算時效率不如C語言。MEX文件不適合所有的應(yīng)用,MATLAB是一個高效率的系統(tǒng),與C和Fortan編譯相比,它能有效降低耗時。一般多數(shù)編程MATLAB均能解決,因此除非你的應(yīng)用程序確實需要MEX文件,否則不必使用MEX文件。使用MEX文件MEX文件是C或Fortran代碼的子程序,它的運行就象M文件和內(nèi)建函數(shù)。MATLAB識別MEX文件是根據(jù)不同操作平臺文件的擴展名,而M文件的擴展名(.m)與操作平臺無關(guān)。不如操作系統(tǒng)下MEX文件的擴展名如下:操作系統(tǒng)平臺MEX文件擴展名HP-UXmexhpuxLinuxmexglxMacintoshmexmacSolarismexsolWindowsdll你可以準確地調(diào)用MEX文件就如同調(diào)用M文件。例如,磁盤的datafuntoolbox目錄上有一conv2.mex的MEX文件,它能實現(xiàn)一個二維矩陣的轉(zhuǎn)換,而conv2.m文件只包含幫助文檔。如果從MATLAB內(nèi)部調(diào)用函數(shù)conv2,解釋器將在MATLAB的搜索路徑(默認的路徑有多條)上查找,直至找到第一次出現(xiàn)的

溫馨提示

  • 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)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論