314 China-bub.com MATLAB5手册 下载 体保存新矩阵到文件中,程序结束*/ matPutArray(mfp,B_ptr); matClose(mfp); mxDestroyArray(A_ptr); mxDestroyArray(B_ptr); exit(O); 这个程序在UNIX下进行编译(在系统提示符下输入连续的一行): gcc -ansi -I/opt/matlab52/extern/include -o matex matex.c -L/opt/matlab52/extern/lib/so12 -R/opt/matlab52/extern/lib/sol2 -lmat -1mx -1mi -lut 注意,所有的路径都和系统有关。当程序运行时,将会在文件 data.mat中添加矩阵 NewMatrix,它等于2*OldMatrix。 ■ 下面列出了与MAT文件有关的程序,用它们可以读和写MATLAB的二进制文件,也可以 在MATLAB和C程序之间传递数据。为了使用这些程序,必须在程序中嵌入头文件mat.h,也 就是在程序开始包含下面一行: #include "mat.h" 在读或写MAT文件之前,必须先打开这个文件,在完成之后关闭文件。用下列程序来完 成打开和关闭文件。 命令集186 C中打开和关闭MAT文件 MATFile 二进制MAT数据文件。 MATFile *matopen(const char *filename,const char *mode); 以mode方式打开文件filename,打开文件的方式有四种:“r”表示读方式,“w”表 示写方式,“u”表示读/写方式,“w4”表示写MATLAB4的MAT文件。如果打开成 功,返回MAT文件的指针:否则返回NULL。 FILE *matGetFp(MATFile *mfp); 返回mfp指向的MAT文件的C文件指针。比如在C的函数ferror()中将会用到。 int matclose(MATFile *mfp); 关闭mp指向的MAT文件。如果关闭成功,返回O:否则返回EOF。 当MAT文件处于打开状态时,就可用下面的程序来读和写文件。 命令集187 C中读和写MAT文件 char **matGetDir(MATFile *mfp,int *num); 给出保存在mfp指向的MAT文件中mxArrays的名字列表指针。参数nm是保存 mxArrays数的变量地址。如果操作失败,返回NULL,并且um变成一个负数。当不 再使用mxArrays列表时,用mxFree释放所占内存:见命令集I75。 mxArray *matGetArray (MATFile *mfp,const char *name); 从mfp指向的MAT文件中复制name指定的mxArray。如果复制成功,返回一个
这个程序在U N I X下进行编译(在系统提示符下输入连续的一行 ): 注意,所有的路径都和系统有关。当程序运行时,将会在文件 d a t a . m a t中添加矩阵 N e w M a t r i x,它等于2*O l d M a t r i x。 下面列出了与M AT文件有关的程序,用它们可以读和写 M AT L A B的二进制文件,也可以 在M AT L A B和C程序之间传递数据。为了使用这些程序,必须在程序中嵌入头文件 m a t . h,也 就是在程序开始包含下面一行: #include "mat.h" 在读或写M AT文件之前,必须先打开这个文件,在完成之后关闭文件。用下列程序来完 成打开和关闭文件。 命令集1 8 6 C中打开和关闭M AT文件 M A T F i l e 二进制M AT数据文件。 MATFile *matOpen(const char *filename, const char *mode); 以m o d e方式打开文件f i l e n a m e,打开文件的方式有四种:“r”表示读方式,“w”表 示写方式,“u”表示读/写方式,“w 4”表示写M ATLAB 4 的M AT文件。如果打开成 功,返回M AT文件的指针;否则返回N U L L。 FILE *matGetFp(MATFile *mfp); 返回m f p指向的M AT文件的C文件指针。比如在C的函数f e r r o r ( )中将会用到。 int matClose(MATFile *mfp); 关闭m f p指向的M AT文件。如果关闭成功,返回 0;否则返回E O F。 当M AT文件处于打开状态时,就可用下面的程序来读和写文件。 命令集1 8 7 C中读和写M AT文件 char **matGetDir(MATFile *mfp,int *num); 给出保存在 m f p指向的 M AT文件中 m x A r r a y s的名字列表指针。参数 n u m是保存 m x A r r a y s数的变量地址。如果操作失败,返回 N U L L,并且n u m变成一个负数。当不 再使用m x A r r a y s列表时,用m x F r e e释放所占内存;见命令集1 7 5。 mxArray *matGetArray(MATFile *mfp, const char *name); 从m f p指向的M AT文件中复制n a m e指定的m x A r r a y。如果复制成功,返回一个 3 1 4 M ATLAB 5 手册 下载 /*保存新矩阵到文件中,程序结束*/ ■
China-pub.coM 第I5章MATLAB.与其他编程语言结合 315 下载 mxArray指针:否则返回NULL。当不再使用时,用mxDestroyArray释放mxArray 所占内存:见命令集175。 mxArray *matGetArrayHeader(MATFile *mfp,const char +name); 和上个函数相似,但是是复制数组开始部分的信息。 mxArray *matGetNextArray(MATFile *mfp); 复制m师指向的MAT文件中下个mxArray.。如果复制成功,返回一个mxArray指针:否则 返回NULL。当不再使用时,用nxDestroyArray释放它所占的内存:见命令集175。 mxArray *matGetNextArrayHeader(MATFile *mfp); 和上个函数相似,但是是复制数组开始部分的信息。 int matputArray(MATFile *mfp,const mxArray *mp); 将mp指向的mxArray写入到mfp指向的MAT文件中。如果文件中已有这个mxArray, 那么就被覆盖。如果写操作成功,返回0:否则返回一个非零数。 int matputArrayAsGlobal(MATFile *mfp,const mxArray +mp); 和上个函数相似,但是当mxArray读入到MATLAB中时,它被存放到全局工作区中。 在局部工作区中也可以使用它。 int matDeleteArray(MATFile *mfp,const char *name); 从mfp指向的MAT文件中删除name指定的mxArray。如果删除成功,返回O:否则返 回一个非零数。 MATLAB4.2中的一些函数已被一些新函数所取代,I旧函数的保留是为了使MATLAB5能 向下兼容,但是已不在C程序中使用了。 命令集188C中与MAT文件操作有关的旧程序 matGetFull matGetMatrix matGetNextMatriz matGetString matPutFull matPutMatrix matPutString matDeleteNatrix 使用下面的命令来编译和链接使用MAT文件的程序: ·UNIX:在系统提示符下输入一不间断行: gcc -ansi -I/.../matlab/extern/include -o programname sourcecode.c -L/.../matlab/extern/lib/...-R/.../matlab/extern/lib/... -lmat -1mx -lmi -lut 上面路径中的三个点,.,表示这部分路径是系统安装路径,programname是用户调用 的程序名,sourcecode.c是要进行编译的C源代码文件列表。这里使用的编译器是gcc,当然, 其他的编译器也可以使用,只要它们按ANSI标准进行编译旧可以。如果需要,可以设置调试 和优化标识:见编译器文档。 ·Windows:在MATLAB提示符下输入: mex sourcecode.c -f optfil 其中optfil表示批处理文件watengmatopts.bat(Watcom C)、msvcengmatopts.bat(Microsoft Visual C)或bccengmatopts.bat(Borland C).参数sourcecode.c是要进行编译的C源代码文件列表
m x A r r a y指针;否则返回N U L L。当不再使用时,用m x D e s t r o y A r r a y释放m x A r r a y 所占内存;见命令集1 7 5。 mxArray *matGetArrayHeader(MATFile *mfp, const char *name); 和上个函数相似,但是是复制数组开始部分的信息。 mxArray *matGetNextArray(MATFile *mfp); 复制m f p指向的M AT文件中下个m x A r r a y。如果复制成功,返回一个m x A r r a y指针;否则 返回N U L L。当不再使用时,用m x D e s t r o y A r r a y释放它所占的内存;见命令集1 7 5。 mxArray *matGetNextArrayHeader(MATFile *mfp); 和上个函数相似,但是是复制数组开始部分的信息。 int matPutArray(MATFile *mfp, const mxArray *mp); 将m p指向的m x A r r a y写入到m f p指向的M AT文件中。如果文件中已有这个 m x A r r a y, 那么就被覆盖。如果写操作成功,返回 0;否则返回一个非零数。 int matPutArrayAsGlobal(MATFile *mfp, const mxArray *mp); 和上个函数相似,但是当 m x A r r a y读入到M AT L A B中时,它被存放到全局工作区中。 在局部工作区中也可以使用它。 int matDeleteArray(MATFile *mfp, const char *name); 从m f p指向的M AT文件中删除n a m e指定的m x A r r a y。如果删除成功,返回 0;否则返 回一个非零数。 M ATLAB 4.2中的一些函数已被一些新函数所取代,旧函数的保留是为了使 M ATLAB 5能 向下兼容,但是已不在C程序中使用了。 命令集1 8 8 C中与M AT文件操作有关的旧程序 使用下面的命令来编译和链接使用 M AT文件的程序: • UNIX:在系统提示符下输入一不间断行: 上面路径中的三个点, . . .,表示这部分路径是系统安装路径, p r o g r a m n a m e是用户调用 的程序名,s o u r c e c o d e . c是要进行编译的C源代码文件列表。这里使用的编译器是 g c c,当然, 其他的编译器也可以使用,只要它们按 A N S I标准进行编译旧可以。如果需要,可以设置调试 和优化标识;见编译器文档。 • Wi n d o w s:在M AT L A B提示符下输入: mex sourcecode.c -f optfil 其中o p t f i l表示批处理文件w a t e n g m a t o p t s . b a t( Watcom C)、m s v c e n g m a t o p t s . b a t( M i c r o s o f t Visual C)或 b c c e n g m a t o p t s . b a t(Borland C)。参数s o u r c e c o d e . c是要进行编译的C源代码文件列表。 第1 5章 M AT L A B与其他编程语言结合 3 1 5 下载
316 MATLAB5手册 China-pub.com 下载 ·Macintosh:见MATLAB5手册《应用程序接口指南》。 15.2.3C调用MATLAB 为了使C能调用MATLAB,首先要打开一个MATLAB工程。通过调用命令engOpen就能很 简单地打开一个工程:见命令集189。 下一步就是将mxArray转换成在MATLAB中可操作的形式。这可以分成两步来完成: I)第1步是将mxArray转换成MATLAB可理解的形式,这又有两种不同的方式。一是用程 序mxCreate来创建矩阵,之后用mxSetName对它们进行命名。这些程序的描述在15.2.1节中。 另一种方式是选择将一个自定义的数据结构复制到mxArray中。然而值得注意的一点是 MATLAB在存储矩阵时是按列序来保存的,而在C中是按行序来保存的,所以必须分清下标。 2)第2步是将矩阵放入MATLAB工作区中,可以用以engPut开头的程序来完成:见命令集89。 现在MATLAB已准备好接收命令了。这些命令可以在普通命令窗口中给出,但是是以字 符串的形式传递给函数engEvalString。 最后,从MATLAB到C的转换和传递也是有必要的。 这听起来相当的复杂,但是用下面的这个例子来说明就显得清楚多了。 ■例15.2 假设C程序中有一个矩阵,这个程序是有关计算机图形使用的。使用MATLAB就能很好 地将图形显示出来。编写下面C程序并将它保存在文件plotm.c中: #include”engine.h" void main() Engine *ep; mxArray *A_ptr; double*A; int i,ji /*创建一个新矩阵*/ A_ptr mxCreateDoubleMatrix(10,10,mxREAL); mxSetName(A_ptr,"A"); A mxGetPr(A_ptr); for(i=0;1<10;i+) for(j=0;j<10;j++) A[i+10*]=(灯+1)*(j+1)*(i+1)*(1+1); /*打开一个MATLAB.工程*/ ep engOpen("/opt/matlab52/bin/matlab"); *传递新矩阵*/ engPutArray(ep,A_ptr); /*画出图形并保存*/
• M a c i n t o s h:见M ATLAB 5手册《应用程序接口指南》。 15.2.3 C调用M AT L A B 为了使C能调用M AT L A B,首先要打开一个M AT L A B工程。通过调用命令e n g O p e n就能很 简单地打开一个工程;见命令集 1 8 9。 下一步就是将m x A r r a y转换成在M AT L A B中可操作的形式。这可以分成两步来完成: 1) 第1步是将m x A r r a y转换成M AT L A B可理解的形式,这又有两种不同的方式。一是用程 序m x C re a t e来创建矩阵,之后用m x S e t N a m e对它们进行命名。这些程序的描述在 1 5 . 2 . 1节中。 另一种方式是选择将一个自定义的数据结构复制到 m x A r r a y中。然而值得注意的一点是 M AT L A B在存储矩阵时是按列序来保存的,而在 C中是按行序来保存的,所以必须分清下标。 2) 第2步是将矩阵放入M AT L A B工作区中,可以用以e n g P u t开头的程序来完成;见命令集1 8 9。 现在M AT L A B已准备好接收命令了。这些命令可以在普通命令窗口中给出,但是是以字 符串的形式传递给函数e n g E v a l S t r i n g。 最后,从M AT L A B到C的转换和传递也是有必要的。 这听起来相当的复杂,但是用下面的这个例子来说明就显得清楚多了。 ■ 例1 5 . 2 假设C程序中有一个矩阵,这个程序是有关计算机图形使用的。使用 M AT L A B就能很好 地将图形显示出来。编写下面 C程序并将它保存在文件p l o t m . c中: 3 1 6 M ATLAB 5 手册 下载 /*创建一个新矩阵*/ /*打开一个MATLAB工程*/ /*传递新矩阵*/ /*画出图形并保存*/
China-pub.com 第I5章MATLAB与其他编程语言结合 317 下载 engEvalString(ep,"mesh(A);"); engEvalString(ep,"print picture.eps -deps;"); /*结束*/ engClose(ep); mxDestroyArray(A_ptr); exit(O); 在UNX环境下编译这个程序,可以在系统提示符下输入下面一不间断行命令: gcc -ansi -I/opt/matlab52/extern/include -o plotm plotm.c -L/opt/matlab52/extern/lib/sol2 -R/opt/matlab52/extern/lib/sol2 -leng -lmat -1mx -lmi -lut 注意,所有的路径都和系统有关,程序运行结果如图15-1所示。 10000 8000- 600 40o0 2000- 10 图I5-1将C程序创建的矩阵用MATLAB画出其图形 可以用下面的工程程序来处理MATLAB的调用。注意,这些程序现在已不适用于 Macintosh.系统。要使用这些程序,必须在程序开始包含头文件engine.h,也就是在程序开始 处包含下面一行: #include "engine.h" 命令集189 C中MATLAB工程程序 Engine 表示MATLAB工程。 Engine *engopen(const char *startcmd); 打开一个MATLAB工程,其中startcmd是一个包含打开命令的字符串,通常是 “matlab”。如果打开成功,返回指向MATLAB工程的指针:否则返回NULL。 int engoutputBuffer(Engine *ep,char *p,int n); 给ep指向的MATLAB工程定义一个大小为n的文本缓冲区p,通常屏幕上显示的文本 保存在这里。 int engEvalstring(Engine *ep,const char *string); 在ep指向的MATLAB工程中对字符串string中的MATLAB命令求值。如果求值成功
在U N I X环境下编译这个程序,可以在系统提示符下输入下面一不间断行命令: 注意,所有的路径都和系统有关,程序运行结果如图 1 5 - 1所示。 图15-1 将C程序创建的矩阵用M AT L A B画出其图形 可以用下面的 工程程序 来处理 M AT L A B的调用。注意,这些程序现在已不适用于 M a c i n t o s h系统。要使用这些程序,必须在程序开始包含头文件 e n g i n e . h,也就是在程序开始 处包含下面一行: #include "engine.h" 命令集1 8 9 C中M AT L A B工程程序 E n g i n e 表示M AT L A B工程。 Engine *engOpen(const char *startcmd); 打开一个 M AT L A B工程,其中 s t a r t c m d是一个包含打开命令的字符串,通常是 “m a t l a b”。如果打开成功,返回指向 M AT L A B工程的指针;否则返回N U L L。 int engOutputBuffer(Engine *ep, char *p, int n); 给e p指向的M AT L A B工程定义一个大小为 n的文本缓冲区 p,通常屏幕上显示的文本 保存在这里。 int engEvalString(Engine *ep, const char *string); 在e p指向的M AT L A B工程中对字符串s t r i n g中的M AT L A B命令求值。如果求值成功, 第1 5章 M AT L A B与其他编程语言结合 3 1 7 下载 /*结束*/ ■
318 MATLAB5手册 China-bub.com 下载 返回0:否则返回一个非零数。 mxArray *engGetArray (Engine tep,const char *name); 在ep指向的MATLAB工程中从工作区复制name表示的mxArray。如果复制成功,返 回指向mxArray的指针:否则返回NULL。当mxArray不再使用时,用 mx Destroy Array来释放它所占的内存;见命令集175。 int engputArray(Engine *ep,const mxArray *mp); 将mp指向的mxArray复制到ep指向的MATLAB工程的工作区中。如果复制成功,返 回0:否则返回1。 int engclose(Engine tep); 关闭ep指向的MATLAB工程。如果关闭成功,返回0:否则返回1。 MATLAB4.2中的一些函数已被新函数所取代,I旧函数的保留是为了使MATLAB5能向下 兼容,但是已不在C程序中使用了。 命令集190 C中I旧的MATLAB工程程序 用下面的命令来编译和链接调用MATLAB的C程序。 engGetFull enGetMatrix engPutFull engPutMatrix engSetEvalCallback engSetEvalTimeout engWinInit ·UNX:在系统提示符下输入一不间断行: gcc -ansi -I/.../matlab/extern/include -o programname sourcecode.c -L/.../matlab52/extern/lib/... -R/.../matlab/extern/lib/... -leng -lmat -lmx -lmi -lut 上面路径中的三个点,,表示这部分路径是系统有关,programname是用户调用的程 序名,sourcecode.c是要进行编译的C源代码文件列表。这里使用的编译器是gcc,当然,其 他的编译器也可以使用,只要它们按ANSI标准进行编译就可以。如果需要,可以设置调试和 优化标识:见编译器文档。 ·Windows:在MATLAB提示符下输入: mex sourcecode.c-f optfil 其中optfil表示批处理文件watengmatopts.bat(Watcom C)、msvcengmatopts.bat(Microsoft Visual C)或bccengmatopts..bat(Borland C)。参数sourcecode.c是要进行编译的C源代码文件列 表。 15.2.4 MATLAB调用C 本节开始用一个简单的例子来说明MATLAB对C的调用。在MATLAB中调用C和调用普通 的函数文件即M文件是一样的
返回0;否则返回一个非零数。 mxArray *engGetArray(Engine *ep, const char *name); 在e p指向的M AT L A B工程中从工作区复制 n a m e表示的m x A r r a y。如果复制成功,返 回指 向 m x A r r a y 的指 针; 否则 返回 N U L L 。当 m x A r r a y 不再 使用 时 ,用 m x D e s t r o y A r r a y来释放它所占的内存;见命令集 1 7 5。 int engPutArray(Engine *ep, const mxArray *mp); 将m p指向的m x A r r a y复制到e p指向的M AT L A B工程的工作区中。如果复制成功,返 回0;否则返回1。 int engClose(Engine *ep); 关闭e p指向的M AT L A B工程。如果关闭成功,返回 0;否则返回1。 M ATLAB 4.2中的一些函数已被新函数所取代,旧函数的保留是为了使 M ATLAB 5能向下 兼容,但是已不在C程序中使用了。 命令集1 9 0 C中旧的M AT L A B工程程序 用下面的命令来编译和链接调用 M AT L A B的C程序。 • U N I X:在系统提示符下输入一不间断行: 上面路径中的三个点, . . .,表示这部分路径是系统有关, p r o g r a m n a m e是用户调用的程 序名,s o u r c e c o d e . c是要进行编译的C源代码文件列表。这里使用的编译器是 g c c,当然,其 他的编译器也可以使用,只要它们按 A N S I标准进行编译就可以。如果需要,可以设置调试和 优化标识;见编译器文档。 • Wi n d o w s:在M AT L A B提示符下输入: mex sourcecode.c -f optfil 其中o p t f i l表示批处理文件w a t e n g m a t o p t s . b a t( Watcom C)、m s v c e n g m a t o p t s . b a t( M i c r o s o f t Visual C)或 b c c e n g m a t o p t s . b a t(Borland C)。参数s o u r c e c o d e . c是要进行编译的C源代码文件列 表。 15.2.4 MAT L A B调用C 本节开始用一个简单的例子来说明 M AT L A B对C的调用。在M AT L A B中调用C和调用普通 的函数文件即M文件是一样的。 3 1 8 M ATLAB 5 手册 下载