matlab入门经典教程第十二章 应用程序接口APIWord文档格式.docx

上传人:b****5 文档编号:18829658 上传时间:2023-01-01 格式:DOCX 页数:39 大小:1.54MB
下载 相关 举报
matlab入门经典教程第十二章 应用程序接口APIWord文档格式.docx_第1页
第1页 / 共39页
matlab入门经典教程第十二章 应用程序接口APIWord文档格式.docx_第2页
第2页 / 共39页
matlab入门经典教程第十二章 应用程序接口APIWord文档格式.docx_第3页
第3页 / 共39页
matlab入门经典教程第十二章 应用程序接口APIWord文档格式.docx_第4页
第4页 / 共39页
matlab入门经典教程第十二章 应用程序接口APIWord文档格式.docx_第5页
第5页 / 共39页
点击查看更多>>
下载资源
资源描述

matlab入门经典教程第十二章 应用程序接口APIWord文档格式.docx

《matlab入门经典教程第十二章 应用程序接口APIWord文档格式.docx》由会员分享,可在线阅读,更多相关《matlab入门经典教程第十二章 应用程序接口APIWord文档格式.docx(39页珍藏版)》请在冰豆网上搜索。

matlab入门经典教程第十二章 应用程序接口APIWord文档格式.docx

;

'

1234'

ABCD'

]

A=

abcd

1234

ABCD

 

12.1.3C语言MEX文件源程序的构成

【例12.1.3-1】列出具有相同运算功能(实现两个双精度实数标量加法)的C++源码程序和C++MEX源码程序;

对C++MEX源码程序进行编译链接;

在MATLAB中调用生成的DLL文件。

通过本例,从感性上认识:

(A)一般C源码文件如何改写成具有约定格式的CMEX源码文件;

(B)CMEX源码文件的基本结构;

(C)基本的编译链接方法;

(D)DLL文件的调用方法。

(1)

#include<

math.h>

voidmyplus(doubley[],doublex[],doublez[])

{

y[0]=x[0]+z[0];

return;

}

(2)

[exm12013_1.cpp]

#include"

mex.h"

//<

1>

//-------------------------------------------------

voidmexFunction(intnlhs,mxArray*plhs[],intnrhs,constmxArray*prhs[])//<

8>

double*x,*y,*z;

//

intmrows0,ncols0;

//

intmrows1,ncols1;

if(nrhs!

=2)//<

13>

mexErrMsgTxt("

Twoinputsrequired."

);

//<

16>

elseif(nlhs>

1)//<

15>

Toomanyoutputarguments"

//<

mrows0=mxGetM(prhs[0]);

//<

17>

ncols0=mxGetN(prhs[0]);

mrows1=mxGetM(prhs[1]);

ncols1=mxGetN(prhs[1]);

20>

//

if(!

mxIsDouble(prhs[0])||mxIsComplex(prhs[0])||!

(mrows0==1&

&

ncols0==1))//<

22>

Inputsmustbeallnoncomplexscalardouble."

mxIsDouble(prhs[1])||mxIsComplex(prhs[1])||!

(mrows1==1&

ncols1==1))//<

25>

if(mrows0!

=mrows1||ncols0!

=ncols1)//<

28>

Inputsmustbesamedimension."

//<

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)

cdD:

\mywork

mexexm12013_1.cpp

direxm12013_1.*

exm1213_1.cppexm1213_1.dll

(4)

a=0.111;

b=0.222;

c=exm12013_1(a,b)

c=

0.3330

12.1.4CMEX文件的执行流程

12.1.5编写CMEX文件的常用库函数和示例

12.1.5.1常用的MEX库函数

voidmexFunction(intnlhs,mxArray*plhs[],intnrhs,constmxArray*prhs[])

/*其他C源码……*/

voidmexErrMsgTxt(constchar*error_msg);

voidmexWarnMsgTxt(constchar*warning_msg);

intmexCallMATLAB(intnlhs,mxArray*plhs[],intnrhs,

mxArray*prhs[],constchar*command_name);

intmexEvalString(constchar*command);

(5)

mxArray*mexGetVariable(constchar*workspace,constchar*var_name);

intmexPutVariable(constchar*workspace,constchar*var_name,mxArray*array_ptr);

12.1.5.2常用的MX函数

matrix.h"

mxArray*mxCreateNumericMatrix(intm,intn,mxClassIDclass,

mxComplexityComplexFlag);

intmxGetM(constmxArray*array_ptr);

intmxGetN(constmxArray*array_ptr);

voidmxSetM(mxArray*array_ptr,intm);

voidmxSetN(mxArray*array_ptr,intm);

double*mxGetPr(constmxArray*array_ptr);

double*mxGetPi(constmxArray*array_ptr);

voidmxSetPr(mxArray*array_ptr,double*pr);

voidmxSetPi(mxArray*array_ptr,double*pr);

stdlib.h>

void*mxCalloc(size_tn,size_tsize);

12.1.5.3编程示例

【例12.1.5.3-1】创建一个C语言MEX文件,实现对MATLAB两个“单行”字符串的合并。

本例演示:

(A)如何根据MATLAB约定的规则编写CMEX源码;

(B)如何构成该文件的调用指令;

(C)如何为MEX文件编写在线帮助文件。

//<

string.h"

2>

voidstringplus(char*input_buf0,char*input_buf1,char*output_buf)

strcat(output_buf,input_buf0);

strcat(output_buf,input_buf1);

voidmexFunction(intnlhs,mxArray*plhs[],intnrhs,constmxArray*prhs[])//<

10>

char*input_buf0,*input_buf1,*output_buf;

intbuflen,buflen0,buflen1,status;

=2)//<

Twoinputsinquired."

//<

14>

1)//<

Toomanyoutputarguments."

if(mxIsChar(prhs[0])!

=1||mxIsChar(prhs[1])!

=1)//<

Inputsmustbeastring."

if(mxGetM(prhs[0])!

=1||mxGetM(prhs[1])!

19>

Inputsmustbearowvector."

buflen0=(mxGetM(prhs[0])*mxGetN(prhs[0]))+1;

21>

buflen1=(mxGetM(prhs[1])*mxGetN(prhs[1]))+1;

buflen=buflen0+buflen1-1;

input_buf0=(char*)mxCalloc(buflen0,sizeof(char));

input_buf1=(char*)mxCalloc(buflen1,sizeof(char));

output_buf=(char*)mxCalloc(buflen,sizeof(char));

status=mxGetString(prhs[0],input_buf0,buflen0);

30>

if(status!

=0)

mexWarnMsgTxt("

Notenoughspace,Stringistruncated."

status=mxGetString(prhs[1],input_buf1,buflen1);

stringplus(input_buf0,input_buf1,output_buf);

plhs[0]=mxCreateString(output_buf);

39>

cdd:

\mywork

mexexm120153_1.cpp

根据以上分析,就可以写出下列exm120153_1.m文件:

%exm120153_1.mTwostringsareconcatenatedintoalargerstring.

%Cstr=exm120153_1(Astr,Bstr)把字符串Astr和Bstr水平串联

%Astr被串联的“单行”字符串

%Bstr被串联的“单行”字符串

%Cstr由Astr在前,Bstr在后,串联而成的字符串。

%2002年11月编写

A='

B='

C=exm120153_1(A,B)

C=

1234abcd

【例12.1.5.3-2】用C语言编写MEX源码文件,在运行中实现对MATLAB函数的调用,画出了

曲线。

(A)如何在MEX文件中调用MATLAB的内建指令;

(B)如何在MEX文件中调用用户的自编M文件。

#defineMAX1000

voidfill(double*pr,int*pm,int*pn,intmax)

inti;

*pm=max/2;

*pn=1;

for(i=0;

i<

(*pm);

i++)

pr[i]=i*(4*3.14159/max);

voidmexFunction(intnlhs,mxArray*plhs[],intnrhs,constmxArray*prhs[])

intm,n,max=MAX;

mxArray*rhs[1],*lhs[1];

rhs[0]=mxCreateDoubleMatrix(max,1,mxREAL);

fill(mxGetPr(rhs[0]),&

m,&

n,MAX);

mxSetM(rhs[0],m);

mxSetN(rhs[0],n);

mexCallMATLAB(1,lhs,1,rhs,"

mexzzy"

mexCallMATLAB(0,NULL,1,lhs,"

plot"

mxDestroyArray(rhs[0]);

mxDestroyArray(lhs[0]);

\mywork

mexexm120153_2.cpp

exm120153_2

图12.1-2

12.2MAT数据文件的应用

12.2.1数据的输入输出方法

12.2.2创建MAT文件的C源码程序的编写

【例12.2.2-1】目标:

用C++编写一个可创建MAT文件的独立应用程序exm12022_1.exe。

通过该例演示:

(A)可创建MAT文件的独立应用程序的编写步骤;

(B)相应C++源程序的基本格式;

(C)相应mx-函数和C指令的配合应用。

(D)MAT库函数matClose,matGetArray,matOpen,matPutArray,matPutArrayAsGlobal的使用方法;

stdio.h>

mat.h"

string.h>

#defineBUFSIZE255

//----------------------------------------------------------

intcreate(constchar*file)

MATFile*pmat;

mxArray*pa1,*pa2,*pa3;

doubledata[9]={1.0,4.0,7.0,2.0,5.0,8.0,3.0,6.0,9.0};

charstr[BUFSIZE];

printf("

Creatingfile%s...\n\n"

file);

pmat=matOpen(file,"

w"

if(pmat==NULL)

{

printf("

Errorcreatingfile%s\n"

(doyouhavewritepermissioninthisdirectory?

)\n"

return

(1);

}

pa1=mxCreateDoubleMatrix(3,3,mxREAL);

mxSetClassName(pa1,"

LocalDouble"

pa2=mxCreateDoubleMatrix(3,3,mxREAL);

mxSetClassName(pa2,"

GlobalDouble"

memcpy((void*)(mxGetPr(pa2)),(void*)data,sizeof(data));

pa3=mxCreateString("

MATLAB:

thelanguageoftechnicalcomputing"

mxSetClassName(pa3,"

LocalString"

matPutVariable(pmat,"

pa1);

matPutVariableAsGlobal(pmat,"

pa2);

matPutVariable(pmat,"

pa3);

memcpy((void*)(mxGetPr(pa1)),(void*)data,sizeof(data));

mxDestroyArray(pa1);

mxDestroyArray(pa2);

mxDestroyArray(pa3);

if(matClose(pmat)!

=0)

Errorclosingfile%s\n"

file);

//

r"

if(pmat==NULL)

Errorreopeningfile%s\n"

pa1=matGetVariable(pmat,"

//

if(pa1==NULL)

ErrorreadingexistingmatrixLocalDouble\n"

if(mxGetNumberOfDimensions(pa1)!

=2)

Errorsavingmatrix:

resultdoesnothavetwodimensions\n"

pa2=matGetVariable(pmat,"

if(pa2==NULL)

ErrorreadingexistingmatrixGlobalDouble\n"

(mxIsFromGlobalWS(pa2)))

Errorsavingglobalmatrix:

resultisnotglobal\n"

pa3=matGetVariable(pmat,"

if(pa3==NULL)

ErrorreadingexistingmatrixLocalString\n"

mxGetString(pa3,str,255);

if(strcmp(str,"

th

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

当前位置:首页 > IT计算机 > 计算机硬件及网络

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1