matlab教程详解 11Word文档下载推荐.docx
- 文档编号:16624494
- 上传时间:2022-11-24
- 格式:DOCX
- 页数:39
- 大小:1.54MB
matlab教程详解 11Word文档下载推荐.docx
《matlab教程详解 11Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《matlab教程详解 11Word文档下载推荐.docx(39页珍藏版)》请在冰豆网上搜索。
;
'
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,"
thelanguageof
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- matlab教程详解 11 matlab 教程 详解
![提示](https://static.bdocx.com/images/bang_tan.gif)