MATLAB中的应用程序接口API
前面章节主要叙述MATLAB自身的各种功能和使用方法。作为优秀软件,MATLAB不仅自身功能强大、环境友善、能十分有效地处理各种科学和工程问题,而且具有极好的开放性。这开放性表现在两方面:一,MATLAB适应各科学、专业研究的需要,提供了各种专业性的工具包;二,MATLAB为实现与外部应用程序的“无缝”结合,提供了专门的应用程序接口API。遵循本书“淡化专业,面向通用”的宗旨,本章将集中阐述MATLAB的应用程序接口。本章分五节,各节内容简述如下。
第12.1节集中介绍:如何编写C MEX源码程序,也就是如何为现有的C程序编写接口程序,使之成为MATLAB函数文件;运用这种技术,读者可以把积累的优秀C程序改造成可在MATLAB中方便调用的指令。
第12.2节用于演示:如何编写产生MAT数据文件的C源码程序。读者通过算例入门,就不难借助MAT文件实现MATLAB与外部应用程序的数据交换。
第12.3节围绕MATLAB引擎技术展开。借助这种技术,前台可以是各种外部应用程序编写的界面,而后台计算则可完全交由MATLAB进行。
第12.4节用三个算例来说明如何应用ActiveX实现MATLAB与外部应用程序的通信。在第一个算例中,MATLAB用作为客户,服务器是Excel。在后两个算例中,服务器是MATLAB,而客户是PowerPoint。由此产生的PPT文件,可以在放映过程中,实时地进行MATLAB调用。
第12.5节的内容是:如何借助DDE技术在MATLAB与其他外部程序间进行通信。该节的一个算例演示:VB制作的界面如何借助DDE建立的对话通道调用服务器MATLAB进行计算和显示结果图形。而另一个算例则演示:MATLAB如何以客户身份与服务器Excel建立DDE“热连接”,使MATLAB图形实时地跟随电子表格数据的改变而变化。
值得指出:MATLAB6.0, 6.1版用于API的(MEX、MAT、及引擎)库函数许多已经被废止。本章内容是根据MATLAB6.5编写的。
12.1 C语言MEX文件的编写
12.1.1 关于MEX文件的一般性说明 12.1.2 MEX文件中的MATLAB数据
A=['abcd';'1234';'ABCD']
A = abcd 1234 ABCD
1
12.1.3 C语言MEX文件源程序的构成
【例12.1.3-1】列出具有相同运算功能(实现两个双精度实数标量加法)的C++源码程序和C++ MEX源码程序;对C++ MEX源码程序进行编译链接;在MATLAB中调用生成的DLL文件。通过本例,从感性上认识:(A)一般C源码文件如何改写成具有约定格式的C MEX源码文件;(B)C MEX 源码文件的基本结构;(C)基本的编译链接方法;(D)DLL文件的调用方法。 (1)
#include
void myplus(double y[],double x[],double z[]) {
y[0]=x[0]+z[0]; return; }
(2)
[exm12013_1.cpp]
#include \ // <1>
//------------------------------------------------- void myplus(double y[],double x[],double z[]) {
y[0]=x[0]+z[0]; }
//-------------------------------------------------
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) //<8> {
double *x,*y,*z; // int mrows0,ncols0; // int mrows1,ncols1; //
if (nrhs!=2) //<13>
mexErrMsgTxt(\ //<16>
else if (nlhs>1) //<15>
mexErrMsgTxt(\ //<16>
mrows0=mxGetM(prhs[0]); //<17>
ncols0=mxGetN(prhs[0]); mrows1=mxGetM(prhs[1]);
2
ncols1=mxGetN(prhs[1]); //<20> //
if (!mxIsDouble(prhs[0])||mxIsComplex(prhs[0])||!(mrows0==1 //<22>
mexErrMsgTxt(\ //
if (!mxIsDouble(prhs[1])||mxIsComplex(prhs[1])||!(mrows1==1 //<25>
mexErrMsgTxt(\ //
if (mrows0!=mrows1||ncols0!=ncols1) //<28>
mexErrMsgTxt(\ //<29> //
plhs[0]=mxCreateDoubleMatrix(mrows0,ncols0,mxREAL); //<31>
x=mxGetPr(prhs[0]); //<32>
z=mxGetPr(prhs[1]); //<33>
y=mxGetPr(plhs[0]); //<34>
myplus(y,x,z); }
(3)
cd D:\\mywork mex exm12013_1.cpp dir exm12013_1.*
exm1213_1.cpp exm1213_1.dll
(4)
a=0.111;b=0.222; c=exm12013_1(a,b)
c =
0.3330
&& ncols0==1))
&& ncols1==1))
3
12.1.4 C MEX文件的执行流程
12.1.5 编写C MEX文件的常用库函数和示例
12.1.5.1 常用的MEX库函数
(1)
#include \
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) {
/* 其他C源码……*/ }
(2)
#include \
void mexErrMsgTxt(const char *error_msg);
void mexWarnMsgTxt(const char *warning_msg);
(3)
#include \
int mexCallMATLAB(int nlhs, mxArray *plhs[], int nrhs,
mxArray *prhs[], const char *command_name);
(4)
#include \
int mexEvalString(const char *command);
(5)
#include \
mxArray *mexGetVariable(const char *workspace, const char *var_name);
int mexPutVariable(const char *workspace, const char *var_name, mxArray *array_ptr);
12.1.5.2 常用的MX函数
(1)
#include \
mxArray *mxCreateNumericMatrix(int m, int n, mxClassID class, mxComplexity ComplexFlag);
4
相关推荐: