收藏 分享(赏)

MATLAB初学者学习.doc

上传人:j35w19 文档编号:7550406 上传时间:2019-05-21 格式:DOC 页数:28 大小:223KB
下载 相关 举报
MATLAB初学者学习.doc_第1页
第1页 / 共28页
MATLAB初学者学习.doc_第2页
第2页 / 共28页
MATLAB初学者学习.doc_第3页
第3页 / 共28页
MATLAB初学者学习.doc_第4页
第4页 / 共28页
MATLAB初学者学习.doc_第5页
第5页 / 共28页
点击查看更多>>
资源描述

1、第六章 MATLAB 应用程序接口通过前几章的介绍,不难发现 MATLAB 系统本身功能已经相当完善,但是作为一个优秀的数学工具软件,仅仅在自身内部进行程序的设计是远远不够的,更为重要的是能与其他的程序设计语言进行交互操作,同时这和交互操作也不应仅仅局限于数据本身的传递,还应当包括相互之间函数的调用等更为深层次和处理。MATLAB 提供了与其他程序设计语言(主要是 C 语言或 Fortran 语言)进行交互的功能,这就是本章将要介绍的 MATLAB 的应用程序接口(Application Program Interface) 。MATLAB 的应用程序接口(API)所涵盖的内容相当广泛,不仅包

2、括与 C 或Fortran 的交互操作,而且在 MATLAB6 中还增加了与 Java 的接口,此外,MATLAB提供了如何使用 ActiveX 和 DDE 的操作以及与硬件的接口。由于具有一定的难度,并且在内容上也涉及到其他程序设计语言的深层知识,所以在本章里将仅借助例程简单介绍 MATLAB 与 C 和 Fortran 的接口的实现。6.1 应用程序接口简介应用程序接口(API)实际上是 MATLAB 的附加组件,是由相关函数构建的接口函数库,通过应用该函数库,可以实现外部程序(主要是 C 语言或 Fortran 语言)与MATLAB 之间的交互。API 所能够完成的交互操作包括: (1)

3、提供编辑 MATLAB 解释器所识别执行的动态链接库(MEX 文件) ,从而能在 MATLAB 环境下直接调用 C 语言或 Fortran 语言编写的程序段;(2)调用 MATLAB 计算引擎,在 C 语言或 Fortran 语言中直接应用MATLAB 内置函数;(3)读写 MATLAB 数据文件(MAT 文件)实现 MATLAB 与 C语言或 Fortran 语言程序间的数据交换等。下面分别对上述 3 个部分功能作简单的介绍。6.1.1 MEX 文件MEX 文件是一种具有特定格式的文件,可以用 C 语言或 Fortran 语言编写,并能够被 MATLAB 程序编译器所识别并执行的动态 连 接

4、函数。MEX 文件是在 MEX 文件环境下调用外部程序的应用接口,通过 MEX 文件,可以在 MATLAB 环境下调用由 C 语言或 Fortran 语言所编写的应用程序模块,重要的是调用过程中并不对所调用程序进行任何的重编处理。此外,能通过 MEX 文件可以把在MATLAB 中执行效率较低的运算转移至其他的高级程序设计语言中来完成,这样就可以大大提高整个程序的执行速度。而且,通过使用 MEX 文件,在 MATLAB 中还可以实现许多 MATLAB 本身难以完成的任务,比如对硬件的操作等。在 MATLAB 中调用 MEX 文件也是相当方便的,其调用方式与使用 MATLAB 的 M文件相同,只需

5、在命令窗口中键入相应的 MEX 文件名即可,同时在 MATLAB 中 MEX文件的调用优先级 M 文件的优先级,所以尽管 MEX 文件可能会与 M 文件重名,也不会影响其执行。一般程序设计过程中都会为 MEX 文件另建一个辅助 M 文件,这是因为 MEX 文件本身不带有 MATLAB 可识别性的帮助信息,也就是说在 MATLAB 环境下,不能够通过帮助系统得到 MEX 文件相应的帮助信息。而获取帮助时,过程的简繁是程序设计好坏的一个重要标志,为了解决这个问题,在实际操作中,一般都是为 MEX 文件建立同名的 M 文件,并在该 M 文件中给出相应的帮助信息,这样在寻求所使用的 MEX 文件帮助是

6、,通过MATLAB 的帮助系统查看同名的 M 文件帮助就可以获得相应的信息。MEX 文件中常用到的函数库为 mx-函数库和 mex-函数库, 前者的作用是提供了在 C语言或 Fortran 语言中编辑 mxArray 结构体对象的方法,而后者则是 C 语言或 Fortran 语言与 MATLAB 的交互操作。mx-函数库与 mex-函数库所提供的函数操作是构建 MEX 文件的基础,几乎所有的 API 操作都是与这两个函数库密切相关的。在 MATLAB 语言中提供了函数 mex 用于编译 MEX 文件,其调用格式为:mex+控制字符串MATLAB 提供了多种控制字符串以完成不同的功能。 argc

7、heck 检测应用程序接口函数输入参数的有效性,仅适用于 C 语言编写的MEX 文件文件。 c:对源代码文件仅编译而不连接。 D:定义预处理程序的宏,仅适用于 Windows 操作系统。 f:以“file” 选项文件对 MEX 文件进行编译,如果文件不在当前目录下,则应当使用全称文件名(包含所有路径) 。 g:创建包含调试信息的 MEX 文件。 h:显示函数“mex ”的帮助信息。 I:在编译器中包含路径名。 output:创建以为名的执行文件。 output:将所输入文件放入的目录下。 v:显示所有的编译连接器的设置。 setup:编译器的设置。 n:非执行标志。 O:建立一个优化的可执行的

8、文件。编译函数 mex 的控制字符串有很多种,对于不同的操作系统会有各自不同的格式,以上介绍的内容基本上对任何操作系统均是适用的。6.1.2 MATLAB 的计算引擎MATLAB 应手程序接口(API)的另一个功能是在其他的程序设计(C 语言或Fortran 语言)中对 MATLAB 内置函数库进行调用,并将 MATLAB 视为一计算引擎,充分发挥 MATLAB 在计算方面的优势。通过 MATLAB 计算引擎,在使用 C 语言或 Fortran 语言编写计算程序时,可以将整个 MATLAB 视为一个数学函数库,方便地加以调用,这样的操作在复杂的数值计算中是相当重要的。由于 MATLAB 基于矩

9、阵计算的优越性,充分利用 MATLAB 函数可在相当程度上弥补 C 语言或 Fortran 语言在数值计算复杂度上的不足,简化程序设计,也使得程序易于维护。另外,这种不同程序设计语言之间的交互调用也可以使得在大型程序设计中做到互取其长,互补其短,充分发挥各种程序设计语言的优点,设计出更好的程序。6.1.3 MAX 文件MAX 文件是 MATLAB 数据存储的默认文件格式,在 MATLAB 环境下生成的数据在存储时,均应以.mat 作为扩展名。MAX 文件由文件头、变量和变量数据库 3 部分组成。其中 MAX 文件的文件头又是由以下 3 部分信息构成,分别为 MATLAB 的版本信息、使用的操作

10、系统平台以及文件创建的时间。例如:% 创建MAX 文件,由于是以二进制码存储,所以只取其文件头,如下MATLAB 5.0MAX-file,plaform:PCWIN,Created on:Mon Oct 23 14:08:39 2000由此不难看出该文件所用的 MATLAB 环境为 MATLAB5.0,而操作系统平台为PCWIN,创建时间为 Mon Oct 23 14:08:39 2000。MATLAB 的 mx-函数库和 mex-函数库中也提供了大量的函数可以对 MAX 文件进行操作,通过调用这些函数,在编写 C 语言或 Fortran 语言的应用程序时,可以实现对MATLAB 数据的处理,

11、进而实现与 MATLAB 之间的数据交换。值得注意的是在对 MAX 文件操作时与用的操作系统无关,这是因为在 MAX 文件中包含了有关的操作系统的信息,调用过程中,MAX 文件本身会进行必要的转换,这也表现出了 MATLAB 的灵活性以及可移植性。6.2 MAX 文件的编辑与使用简介作为应用程序接口的组成部分,MAX 文件在 MATLAB 与其他程序设计语言交互程序设计中发挥着重要的作用,通过 MAX 文件可以方便的调用由 C 语言或 Fortran 语言所编写的程序段,并以此完成不同内容的任务,实现原本由 MATLAB 难以实现或者即便可以实现也非常复杂的任务,由此扩展了 MATLAB 程序

12、设计所能实现的功能。另一方面也节省了系统资源。6.2.1 C 语言的 MEX 文件下面先给出一个 MATLAB 自带的示例 MEX 程序 mexeval.c,以此简要介绍 C 语言编写 MEX 文件的格式及方法。/* C 语言编写的 MEX 文件*/* 头文件申明*/#inchludemex.h/*入口程序*/voidmexFunction(int nlhs,mxArray *plhs ,int nrhs,const mxArray *prhs )if(nrhs=0)/*没有输入参数时报错*/mexErrMsgTxt(Functionmexevalcannot be used without

13、any input variables.n);else if(!mxIsChar(prhso)/*输入参数不为字符型时报错 */const char str=Functionmexeval not defined for variables of class;char errMsg100;sprintf(errMsg ,%s%s/n,str,msGetClassName(prhs0);mexErrMgTxt(errMsg);else/*满足要求时,执行字符串的命令 */*定义变量*/char*fcn;int status;int buflen=mxGetN(prhs0)+1;fcn=(char

14、*)mxCalloc(buflen,sizeof(char);status=mxGetString(prhs0,fcn,buflen);statux=mexEvalString(fcn);if(nrhs= =2)ind buflen;buflen=mxGetN(prhs1)+1;cmd=(char*)mxCalloc(buflen,xizeof(char);mxGetstring(prhs1,cmd,buflen);mexEvalString(cmd);mxFree(cmd);mxFree(fcn);由例程可以看出 C 语言编写的 MEX 文件并没有复杂的内容和格式,与一般的 C 语言程序相同

15、。其中较为独特的是在输入参数中出现的一种新的数据类型 mxArray,该数据类型就是 MATLAB 矩阵在 C 语言中的表述,一种已经在 C 语言文件 matrix.h 中预定义的结构体类型,所以在实际编写 MEX 文件过程中,应当在文件开始时声明该头文件。否则在执行过程中会报错。mxArray 结构体具体的定义方式为:Typedef struct mxArry_tag mxArry;Struct msArry_tag char namemxMAXNAM;ind reservedl2void *reserved2;int number_of_dims;int reserved33;unions

16、tructvoid *pdatavoid *pimag_data;void reserved4;int reserved53;number_array;data;通过调用 matrix.h 头文件就可以在 C 语言中进行对 MATLAB 生成矩阵的远算,由于MATLAB 的接口函数库对 mxArray 结构体做了很好的封装,所以在具体操作过程中,无需了解结构体各部分的具体涵义而只需了解作为其操作工具的 me-函数库,这样大大方便了 MEX 文件的设计,从而就可以不必为不同的操作系统或不同版本语言系统而改动应用程序。另外应指出的是,一般来说 MEX 文件都有固定的程序结构,即入口程序mexFun

17、ction,该程序是 MEX 文件与 MATLAB 的接口,用于完成相互间的程序通信,其结构为:coidmexFunction(int nohs,mxArray*plhs,int nrhs,const msArray*prhs)/*程序代码以实现具体的通信功能 */该函数的输入参数主要有以下 4 个:nlhs、plhs、nrhs 和 prhs。其中 nlhs 为整型变量,用于说明函数的输出参数个数;prhs 为一个指向 mxArray 结构体类型的指针数组,该数组的各元素依次指向所有的输出参数;输入参数 nrhs 也为整型变量,用于说明函数的输入参数的个数;而相应的输入参数 prhs 也为一个

18、指向 mxArray 结构体类型的指针数组,其元素依次指向所有的输入参数。在 MATLAB 程序中调用 MEX 文件的使用方法与普通的 M 文件相同,需要给出必要的输入变量和输出变量。例如:c=mexeval(sin(pi/2);此时,系统已经对入口程序的参数进行了设置,不难看 nlhs 为 1,plhs 为空,nrhs为 1,而 prhs 为指向字符串 sin(pi/2)的指针。当然这里说字符串只是形象的说明,事实上,在调用过程中,MATLAB 内的字符串早已被转换成 C 语言 mxArray 结构型变量了。在 C 语言的 MEX 文件中可以对 MATLAB 的所有语言要素进行操作,从而实现

19、全面的接口,大大扩充了 MATLAB 语言的功能。6.2.2 Fortran 语言的 MEX 文件与 C 语言相同,Fortran 语言也可以实现与 MATLAB 语言的通信,相应的基于Fortran 语言在数据的存储上表现得更为简单一些,这是因为 MATLAB 的数据存储方式与Fortran 语言相同,均是按列存储,所以说编制的 MEX 文件在数据存储上相对简单,而C 语言的数据存储是按行进行的。但是 Fortran 语言没有灵活的指针运算,所以在程序的编制过程中也有额外的麻烦,而 C 语言则没有类似的问题。下面还是先给出一个由 Fortran 语言编制的 MEX 文件的示例。例如:C Fo

20、rtran 语言编制的 MEX 文件C MEX 文件入口程序SUBROUTINE MEXFUNCTION(NLHS ,PLHS,NRHS,PRHS )C 输入输出参数的定义INTEGER MXCREATEFULL,MXGETPRINTEGER NLHS,NRHSC 参数的定义INTEGER MXCREATEFULL,MXGETPRINTEGER MXGETM,MXGETNINTEGER YPP,TP YPINTEGERM,NREAL*8RYPP(4) ,RTP,RYP(4)C 检测变量数目IF(NRHS.NE.2)THENCALL MEXERRMSGTXT(YPRIME requirec tw

21、o input argumengs)ELSELF (NLHS.GT.1)THENCALL MEXERRMSGTXT(YPIME requires lne output argument)ENDIFC 检测变量维数M=MXGETM(PRHS (2) )N=MXGETN(PRHS(2) )IF(MAX(M,N)NE.4).OR.(MIN(M,N).NE.1)THENCALL MEXERRMSGTST(YPRIME requires that Y be a41 vector)ENDIFC 创建 mxArray 结构体变量PLHS(1 )=MXCREATEFULL (M,N,0)C 变量创建指针YPP

22、=MXGETPR(PLGS(1)TP= MXGETPR(PRHS(1)YP= MXGETPR(PRHS(2)C 为变量赋值CALLMXCOPYPTRTOREAL8(TP ,RTP,1)CALLMXCOPYPTRTOREAL8(YP,RYP,4)C 调用子函数CALL YPRIME(RYPP,RTP,RYP)C 输出矩阵数据CALL MXCOPYREAL8TOPTR(RYPP,YPP,4)RETURNENDC 主程序结束CMEX 文件的计算程序SUBROUTINE YPRIME(YP,T,Y )REAL*8YP(4) ,T,Y (4)REAL*8MU,MUS,R1,R2MU=1.0/82.45M

23、US=1.0-MUR1=SQRT(Y(1)+MU)*2+Y(3)*2)R2= SQRT(Y(1)-MUS)*2+Y(3)*2)YP(1)=Y(2)YP(2)=2*Y(4)+Y(1)-MUS*(Y(1)+MU)/(R1*3)-MxArray*T=NULL,*resrlt=NULL;Char bufferBUFSIZE;Double time10=0.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0;If(!(ep=engOpen(“0“)fprintf(stderr, “nCant start mATLAB enginen“);return EXIT_FAILURE;/*程序的

24、第一部分,将数据传输至 MATLAB,并分析结果,绘制图形*/*创建临时数组*/T=mxCreateDoubleMatrix(1,10,mxREAL);MxSetName(T, “T“);Memcpy(void*)mxGetPr(T),(moid*)time,sizeof(time);/*将变量 T 加载到 MATLAB 工作空间中*/engPutArray(ep,T);/*时间-距离函数的计算,distance=(1/2)g .*t .2*/engEvalString(ep, “D=.5.*(-9.8),*T.2; “);/*将结果绘制成图*/engEvalString(ep, “plot(

25、T,D); “);engEcalString(ep, “title(Position vs.Time for a falling object); “);engEvalstring(ep, “x;abe(Time(seconds); “);engEvalstring(ep, “ylabel(positionmeters); “);/*通过函数 fgetc()来确保等待时间足够看清所绘制的图形*/printf(“Hit return to continuenn“)fgetc(stdin);/*完成第一部分功能,释放内存,退出 MATLAB 计算引擎*/printf(“Done for Part

26、I.n“);mxDestuoyArray(T);engEvalStting(ep, “close; “)/*程序和第二部分,在这部分程序中,将为变量 X 赋以 MATLAB 字符串,并执行该字符串命令,创建变量,然后覆盖该变量,测定变量类型*/*通过使用函数 engOrtputBuffer 来获取 MATLAB 输出*/engOrtputBrffer(ep,buffer,BUFSLZE);while(result= =NULL)char strBUFSLZE;/*用户输入字符串*/printf(“Enter aMATLAB command to evaluate . This command

27、shouldn“);printf(“create a caroab;e X. This puogram will then determinen“);printf(“what kind of variable you created.n“);printf(“Fpr exa,;e:X=1:5n“;promtf(“);fgets(str,BUFSIZE-1,stdin);/*通过函数 engEvalString 执行字符串命令 */angEvalString(ep,str);/*显示命令结果,前两个字符总是 “”*/printf(“%s“,buffer+2);/*获得计算结果*/printf(“n

28、RetrievingXn“);if(result=engGetArray(ep,“X“)= =NULL)printf(“Oops! You didnt create a variable X.nn“);elseprintf(“X is class%tn“,mxGetClassName(result);/*程序结束,释放内存,关闭 MATLAB 计算引擎,并且退出*/ printf(“Done!n“); mxDestroyArray(result);engClose(ep);return EXIT_SUCCESS以上为完整的 C 语言编写和程序,其中调用 MATLAB 计算引擎来完成程序中的计算

29、问题,当然作为例程,该函数内的调用过程还是较为简单的,但是其方法也是适用于更为复杂的问题。在 MATLAB 中编译以 C 语言完成的 MATLAB 计算引擎函数的方法是较为简单的,具体调用格式为:me-fbinoptsfilename.bat filename.c其中 matlab root path 为 MATLAB 所在的根目录,批处理文件 optsfilename.bat 为当前系统中 MATLAB 对 C 语言的编译器相对应的选项文件名,而 filename.c 即为 C 语言编写的调用 MATLAB 计算引擎的源文件名。6.3.2 Fortran 语言的 MATLAB 计算引擎下面也

30、先给出一个基于 Fortran 语言的 MATLAB 计算引擎函数调用的示例,这也是MATLAB 自带的演示程序。C Fortran 语言编写的 MATLAB 计算引擎函数C 主程序Progam,mainC 对程序中应用到的 MATLAB 引擎函数库以及 me 函数库中的函数进行类型说明Integer engOpen,engFetMatrix,mxCreateFull,mxGetprC 对程序中的变量类型进行简单说明Integer ep, T,D,resultDouble precision time(10) ,dis (10)Integer stat, tempData time、1.0,2

31、.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0/C 启动 MATLAB 计算引擎,将启动结果赋予指针 epEp=engOpen(matlab)C 判断启动是否成功If(ep.eq.0)thenWrite(6,*)Can“t start MATLAB engineStopEndifC 创建 msArray 结构体对象,并对该变量命名赋值T=mxCreateFull(1,10,0)call mxSetName(T ,T“ )call mxCopyReal8ToPtr(time,mxGetPr(T) ,10)C 将变量 T 加载到 MATLAB 的工作空间中call engP

32、rtMatrix(ep ,T)C 时间-距离函数的计算,distance=(1/2)g.*2call engEvalString(ep,D=.5.*(-9.8).*T.2;)C 将结果绘制成图形call engEvalString(ep,plot(T,D);)call engEvalString(ep,title(“Position vc.Time“)call engEvalString(ep,xlabel(“Time(seconds)“)call engEvalString(ep,ylabel(“Position(meters“)C 设置人机交互程序段,确保能够看到所绘制的图形C 如果输入为

33、 0,则退出程序,而如果输入为 1,则继续进行Print*,Type 0to ExitPrint*,Type 1to continueRead(*,*)tempIf(temp.ep.0)thenPrint*,EXIT!Stopend ifC 关闭当前的图形窗口Call engEvalString(ep,close;)C 获取计算结果,并输出该结果D=engGetMatrix(ep,D)call mxCopyPtrToRea18(mxGetPr(D),dist,10)print*,MATLAB computed the following distances:print*, time(s) di

34、stance(m)do 10 i=1,10print 20,time(i),dist(i)20 format( ,G10.3,G10.3)10 clntinueC 释放所用内存,并退出 MATLAB 引擎的调用call mxFreeMatrix(T)call mxFreeMatrix(result)stat=engClose(ep)stopend以上即为 Fortran 语言编写的 MATLAB 计算引擎的调用函数,与常规的 Fortran 程序相比,只是增加了启动和退出 MATLAB 计算引擎的模块以及创建 mxArray 结构体的模块,其余的函数调用与操作均无特殊之处。Fortran 语言

35、编写的 MATLAB 计算引擎程序的编译与 C 语言编写的完全一致,只是编译器不同,是针对 Fortran 语言的编译器。6.4 MAT 文件的编辑与使用简介本节中将介绍 MATLAB 中 MAT 文件的创建与使用,通过 MAT 文件可以实现MATLAB 与其它程序设计语言 (主要指 C 语言和 Fortran 语言) 之间的数据交换。6.4.1 MATLAB 中的数据处理在 MATLAB 中数据的输入是有很多方法的,可以直接在 MATLAB 命令窗口中输入,也可以通过文本编辑器编辑数据文档后再在 MATLAB 中调用,也可以由 MEX 文件返回其他程序设计语言运行的结果,更为重要的是可以通过

36、 C 语言或 Fortran 语言将数据结果转换成 MAT 文件格式,在 MATLAB 中通过 load 命令加载。从 MATLAB 中读取数据也是有很多方法的,可以使用 MATLAB 的 save 命令将数据存储为指定格式,然后再进行调用,或者可以通过 MATLAB 中输出函数或者写文件函数将数据加载至其他的文件中,此外,同输入数据一样,也可以通过 MEX 文件传出MATLAB 数据结果,而本节将要介绍的是另外一种常用方法,即通过 MAT 文件将数据传递至其他程序设计语言编辑的程序中。6.4.2 C 语言的 MAT 文件下面也要先给出一个基于 C 语言的 MAT 文件示例,该示例是 MATL

37、AB 自带的用于说明 C 语言的 MAT 文件的方法。/*C 语言编写的 MAT 文件函数*/*头文件声明*/#include#include“mat.h“#define BUFSIZE255/*creat 子函数 */int create(const char*file)/*变量声明*/MATFile*pmat;mxArray*pal,*pa2,pa3;double data=1.0,4.0,7.0,2.0,5.0,8.0,3.0,6.0,9.0char strBUFSIZE;Printf(“Creating file %snn“,file);/*打开 MAT 文件*/pmat=matOpe

38、n(file,“w“);if(pmat= =NULL)printf(“Error creating file %sn“,file);printf(“do you hace write permission in this directory?)“n);return(1);/*创建双精度 mxArray 类型的数组,并为其命名,赋值*/pal=mxCreateDoubleMatrix(3,3,mxREAL) ;mxSetName(pa1,“LocalDouble“) ;pa2=mxCreateDorbleMatrix(3,3mxREAL ) ;mxSetName(pa2,“GlobalDoubl

39、e“) ;memcpy( char*) (mxGetPr(pa1) ) ,(char*),3*3*sizeof(double)) ;pa3=mxCreateString(“MATLAB:the language of technical computing“);mxSetName(pa3,“LocalString“);/*将得到的数组写入 MAT 文件*/matPutArray(pmat,pa1);matPutArrayAsGlobal(pmat,pa2);matPutArray(pmat,pa3);memcpy(char*)(mxGetPr(pa1),(char*)data,3*3*size

40、of(double);matputArray(pmat,pa1);/*删除已赋值的指针变量*/mxDestroyArray(pa1);mxDestroyArray(pa2);mxDestroyArray(pa3);/*已关闭 MAT 文件*/if(matClose(pmat)!=0)printf(“Error closing file%n“,file);return(1);/*再次打开 MAT 文件*/pmat=matOpen(file,“r“);if(pmat= =NULL)printf(“Error reopening file %sn“,file);)return(1);/*读取 MAT

41、 文件的数据*/pa1=matGetArray(pmat,“Loca1Double“);if(pa1= =NULL)printf(“Error reading existing matrix LocalDoublen“);return(1);if(mxGetNumberOfDimensions(pa1)!=2)printf(“Error saving matrix:result does not have two dimensionsn“);return(1);pa2=matGetArray(pmat,“GloballDouble“);if(pa2= =NULL)printf(“Error r

42、eading existing matrix GlobalDobalDoublen“);return(1);if(!(mxIsFromloba1WS(pa2)printf(“Error saving global matrix:result is not globaln“);return(1);pa3=matGetArray(pmat,“LocalString“);if(pa3= =NULL)printf(“Error reading existing matrix LocalDoublen“);return(1);mxGetString(pa3,str,255);if(strcmp(str,

43、“MATLAB:the language of technical computing“)printf(“Error saving string:result has incorrect clntentsn“);return(1);/*已删除已赋值的指针变量*/mxDestroyArray(pa1);mxDestroyArray(pa2);mxDestroyArray(pa3);/*关闭已打开的 MAT 文件*/if(matClose(pmat)!=0)printf(“Error closing file %sn,file“);return(1);printf(“Donen“);return(

44、0);/*主程序*/int main()int result;result=create(“mattes.mat“);return(result= =0)?EXIT_SUCCESS:EXIT_FAILURE;由上例也可以看出 C 语言编写 MAT 文件也无特别之处,也是着重于对 mat-函数库中函数的调用.对 C 语言编写的 MAT 文件的编译也是较为简单的,与 MEX 文件的编译方法相同,选择在 MATLAB 中 C 语言编译器的选项文件对其进行编译。6.4.3 Frtran 语言的 MAT 文件接下来给出一个基于 Frtran 语言的 MAT 文件示例,该文件也是 MATLAB 自带的示例

45、程序。C Fortran 语言编写的 MAT 函数C 主程序段 Program matdemolC 定义有关 MAT 文件变量 Integer matOpen,mxCreateFull,mxCreateStringInteger matgetMatrix,mxGetPrInteger mp,pa1 ,pa2,pa3C 其他常用变量Integet status,matCloseDouble precision dat(9)Data dat/1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0/C 打开 MAT 文件准备写入write(6,*)Creating MAT-file

46、matdemo.matmp=matOpen(matdemo.mat,w)If(mp.eq.0)thenwrite(6,*)Can“t open“matdemo.mat“for writing.write(6,*)(Do you have write permission in this directory?)stopend ifC 创建 mxArray 结构体变量并为变量命名Pa1=mxGreateFull(3,3,0)call mxSetName(pa1,Numeric)Pa2=mxCreateString(MATLAB:The language of computing)call mxSe

47、tName(pa2,String)pa3=mxCreateString(MATLAB:The language of computing)call mxSetName(pa3,Sitring2)C 将变量值写入 MAT 文件call matPutMatrix(mp,pa1)call matPutMatrix(mp,pa2)call matPutMatrix(mp,pa3)callmxCoyRea18ToPtr(dat,mxGetPr(pa1),9)call matPutMatrix(mp,pa1)C 从 MAT 文件中删除变量 String2call matDeleteMatrix(mp, S

48、tring2)C 关闭 MAT 文件status=matClose(mp)If(status.ne.0)thenwrite(6,*)Error closingMAT-filestopend ifC 打开 MAT 文件mp=matOpen(matdemo.mat,r)if(status.ne.0)thenwrite(6,*)Can“t open“matdemo.mat“for reading.stop end ifC 从 MAT 文件中读出 mxArray 结构体变量Pa1=matGetMatrix(mp,Numeric)If(mxIsNumeric(pa1).eq.0) thenwrite(6,*)Invalid non-numeric matrix written to MAT-filestopend ifpa3=matGetMatrix(mp, String2)if(pa3.ne.0)thenwrite(6,*) String2 not deleted from MAT-filestopend ifC 删除指针变量,释放内存call mxFreeMatrix(pa1)call mxFreeMatrix(pa2)call mxfreeMatrix(pa3)C 关闭 MAT 文件Satus=matClose(mp)

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报