在MATLAB环境下访问外部函数的共享库文件.doc
《在MATLAB环境下访问外部函数的共享库文件.doc》由会员分享,可在线阅读,更多相关《在MATLAB环境下访问外部函数的共享库文件.doc(11页珍藏版)》请在咨信网上搜索。
1、在MATLAB环境下访问外部函数的共享库文件,必须首先把该库文件加载到内存中。一旦加载成功,就能直接在MATLAB中直接请求关于函数的任何信息。而当不再需要该库时,就应当及时把库文件从内存中卸载以节省内存开销。加载库语法:loadlibrary(shrlib,hfile)其中shrlib为加载的动态链接库文件名(filename.dll),hfile为头文件名,它包含函数原型。例如,当加载包含MATLAB中mx程序的libmx库时,可以使用下列语句。hfile=matlabrootexternincludematrix.h;loadlibray(libmx, hfile)卸载库语法:unloa
2、dlibrary libmx使用两个函数可以获取加载库的信息:libfunctions(libname) or libfunctions libnamelibfunctionsview(libname) or libfunctionsview libname这两个函数的不同之处在于显示结果的方式不同,后者是以图形的方式显示在新的窗口中。而前者返回库libmx中有哪些可用的函数。请看示例:libfunctions libmxMethods for class lib.libmx:mxAddField mxGetFieldNumber mxIsLogicalScalarTruemxArrayToS
3、tring mxGetImagData mxIsNaNmxCalcSingleSubscript mxGetInf mxIsNumericmxCalloc mxGetIr mxIsObjectmxClearScalarDoubleFlag mxGetJc mxIsOpaquemxCreateCellArray mxGetLogicals mxIsScalarDoubleFlagSet如果加上命令开头-full,则可以显示函数返回值的细节。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)值得注意的是,这两个函数返回值的类型均是MATLAB
5、的数据类型,虽然函数是利用C语言编写的。调用库函数一旦库函数被加载到了内存空间,只要指定库名、函数名和变量就可以使用calllib函数调用库中的任何函数了。语法格式: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传递变量当调用外部库里的函数时,该为函数提供哪种类型的变量呢?MATLAB的externexamplesshrlibshrlibsample库里对每一种特殊的变量类型都作出了说明。但我们首先必须把该库文件的路径添加到MATLAB的搜索路径中来,或者使该库文件所在的目录成为当前目录,两种做法的命令如下。addpath(C:MATLAB7externexamplesshrlib)cd(C:MATLAB7externexamplesshrlib)下面的例子就是加载该库并显示了其中的一些函数。loadlibrar
7、y shrlibsample shrlibsample.hlibfunctions shrlibsample full执行上述两行后,返回: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)这里所有的函数都是用C语言编写的。一些通用的规则在函数的输入输出变量问题上,以下几点应注意:1.许多变量类
9、型,象int32、double与C语言的数据类型非常相象。这些变量只需要传递MATLAB型的数据就可以了。2.而有些C语言的变量类型,象*double、还有预定义型与标准MATLAB数据类型是完全不同的。这种情况下,有两种选择,要么给外部函数的入参传递标准的MATLAB数据类型,让MATLAB程序自动转化,要么先使用MATLAB提供的转化函数,如libstruct、libpointer自己转化。关于转化,可以参考Data Conversion。3.C语言通常可以按形参传递变量,但MATLAB不支持这种做法,不过可以创造MATLABPtr或PtrPtr型的变量,去兼容C语言的形参。4.C语言通常
10、还可以通过形参来返回输入变量的值,而MATLAB需要额外的变量来获得返回值。传递变量的通用规则1.库函数传递形参时,标量不必非得声明。2.如果库函数使用单下标来引用二维矩阵元素时,请记住,C语言是逐行处理矩阵元素,而MATLAB是按列优先处理的。因此迎合C语言的习惯,可以在给MATLAB函数传递变量之前把矩阵进行转置,从函数返回后再转置回来就行了。3.由上可知,当传递的矩阵超过二维时,MATLAB会改变矩阵的行列结构,为了确保矩阵的结构不被破坏,可以事先记录矩阵的结构,在调用结束后利用reshape函数还原即可。例如: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.当支持可选参数时,可用一空矩阵来传递一个NULL型参数。这是在变量为Ptr或PtrPtr型时唯一的选择。传参外部库的许多函数是传递形参的,为了能与这些函数交互,MATLAB通常传递一个叫“指针对象”的变量,不过别把
12、它与传参混同了。数据转化在多数情况下,传递给外部库函数或从外部库函数返回的数据类型自动被MATLAB转化,然而,或许你偶尔也希望有些时侯能手动转化:1.当需要传递相同的数据给一系列库函数时,可能手动转化要比让MATLAB自动转化更为明智,更能节省时间。2.当传递大结构的数据时,手动转化数据使之匹配C结构而不是直接采用通用的MATLAB型数据的做法,比直接使用libstruct函数把C结构型的数据转换成MATLAB型数据更能节省内存。3.当外部函数使用超过一层引用(例如,指向指针的指针变量double *)时,用libpointer函数构造一个参数,比直接让MATLAB自动转化数据要好。原始类型
13、共享库接口支持所有标准C数据类型。下表显示了C与MATLAB等价的数据类型。C类型(32位机器)等价MATLAB类型char, byteint8unsigned char, byteuint8shortint16unsigned shortuint16int, longint32unsigned int, unsigned longuint32floatsingledoubledoublechar *string(1-by-n char array)下表显示的lib.pointer类中的数据类型,非MATLAB标准类型C数据类型(32位机器)扩展MATLAB数据类型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可以自动把转化数据为外部库函数所需要的任何原型数据,这就意味着可以传递一个双精度型数据给一个8位整数型变量。下述C函数接受短整型、整型和双精度型数据:double addMixedTypes(short x, int y, double z) re
15、turn (x+y+z);你可以极其简单地在MATLAB中只传递给该函数以双精度变量,MATLAB自动判断每个变量接受何种类型的变量,并作近似转化。calllib (shrlibsample,addMixedTypes, 127, 33000, pi)ans= 3.3130e+004转化参数当外部函数原型定义一个形参时,MATLAB能自动地把一个按值传递的变量转化为形参。因此,当给一个双精度指针变量赋一双精度变量时,MATLAB会自动地把该双精度变量转化为双精度形参。addDoubleRef是一个接受双精度指针型形参的函数:double addDoubleRef( double x, boub
16、le *y, double z) return (x+ *y +z);用三个双精度变量调用该函数,MATLAB自动处理数据转化:calllib (shrlibsample, addDoubleRef, 1.78, 5.42, 13.3)ans= 20.5000字符串当变量需要字符型指针数据时,你可以传递一个MATLAB型字符串(矩阵)。下述C函数接受一个字符指针型数据:char * stringToUpper (char *input) char *p=input; if (p!=NULL) while (*p!=0) *p+=toupper(*p); return input;libfunc
17、tions显示,你可以用一个MATLAB字符串作为输入。libfunctions shrlibsample full string, string stringToUpper (string )定义一个MATLAB字符矩阵str,把它传递给变量。str=This was a Mixed Case string; %MATLAB中字符串以“”号对表示calllib( shrlibsample, stringToUpper, str)ans= THIS WAS A MIXED STRING注意:虽然MATLAB传递给变量的很象字符型的形参,但它并不真正的参数类型。因为它并不包括MATLAB字符矩阵
18、str的地址。因此当函数执行完毕时,字符串的值并未改变。枚举型如果变量被定义为C中的枚举型,你可以传递枚举型或一个与枚举值等价的整数。shrlibsample库中的readEnum函数返回与传入变量相应的枚举型。下述为Enum1的定义和C语言函数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,你可以用一个枚举型字符或等价的整数来表示枚举型数据。上述中定义的枚举型数据TEnum1中,en4与4等价:calllib (shrlibsample, readEnum, en4)ans= you chose en4calllib (shrlibsampel, readEnum, 4)ans= you chose en4结构体型当库函数接受结构体型变量时,你需要给它传递与在结构体定义时拥有相同域名的结构体变量。为了确定结构体变量的域和类型,你可以:1.查询库文档2.在加载到MATLAB的库的头文件中寻找结构体
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MATLAB 环境 访问 外部 函数 共享 文件
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【二***】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【二***】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。