使用MATLAB Engine与C混合编程.docx

上传人:b****2 文档编号:2178658 上传时间:2022-10-27 格式:DOCX 页数:19 大小:25.29KB
下载 相关 举报
使用MATLAB Engine与C混合编程.docx_第1页
第1页 / 共19页
使用MATLAB Engine与C混合编程.docx_第2页
第2页 / 共19页
使用MATLAB Engine与C混合编程.docx_第3页
第3页 / 共19页
使用MATLAB Engine与C混合编程.docx_第4页
第4页 / 共19页
使用MATLAB Engine与C混合编程.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

使用MATLAB Engine与C混合编程.docx

《使用MATLAB Engine与C混合编程.docx》由会员分享,可在线阅读,更多相关《使用MATLAB Engine与C混合编程.docx(19页珍藏版)》请在冰豆网上搜索。

使用MATLAB Engine与C混合编程.docx

使用MATLABEngine与C混合编程

使用MATLABEngine实现与C混合编程

(五)引擎应用程序

1、简介

引擎应用程序的实质是把MATLAB做为一个引擎,它允许从你自己的C++程序调用这个引擎。

在运行时,引擎作为一个进程单独运行,你的C++程序也作为一个进程单独运行,二者可以通过进程间的通信机制进行交互。

2、引擎库

MATLAB引擎库包含了若干个控制MATLAB引擎的函数,如下所示:

engOpen启动MATLAB引擎

engClose关闭MATLAB引擎

engGetArray从MATLAB引擎中获取一个MATLAB矩阵

engPutArray向MATLAB引擎发送一个MATLAB矩阵

engEvalString执行于一个MATLAB命令

engOutputBuffer创建一个存储MATLAB文本输出的缓冲区

同时,引擎应用程序还可以使用前面提到的API函数。

3、一个例子

从这个示例中,我们看出引擎应用程序是如何编制的:

/*

*engdemo.c

*Thisisasimpleprogramthatillustrateshowtocallthe

*MATLABenginefunctionsfromaCprogram.

*/

#include

#include

#include

#include"engine.h"

#defineBUFSIZE256

intmain()

{

Engine*ep;

mxArray*T=NULL,*result=NULL;

charbuffer[BUFSIZE];

doubletime[10]={0.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0,

8.0,9.0};

8.0,9.0};

6-6

/*

*StarttheMATLABenginelocallybyexecutingthestring

*"matlab".

*Tostartthesessiononaremotehost,usethenameof

*thehostasthestringratherthan\0

*Formorecomplicatedcases,useanystringwithwhitespace,

*andthatstringwillbeexecutedliterallytostartMATLAB.

*/

if(!

(ep=engOpen("\0"))){

fprintf(stderr,"\nCan'tstartMATLABengine\n");

returnEXIT_FAILURE;

}/*启动MATLAB引擎*/

/*

*PARTI

*Forthefirsthalfofthisdemonstration,wewillsenddata

*toMATLAB,analyzethedata,andplottheresult.

*Createavariableforourdata.

*/

T=mxCreateDoubleMatrix(1,10,mxREAL);/*创建一个矩阵*/

mxSetName(T,"T");/*设置矩阵的名字为“T”*/

memcpy((void*)mxGetPr(T),(void*)time,sizeof(time));/*向矩阵“T”赋值*/

/*

*把矩阵“T”置入MATLAB引擎

*/

engPutArray(ep,T)

/*

*Evaluateafunctionoftime,distance=(1/2)g.*t.^2

*(gistheaccelerationduetogravity).

*/

engEvalString(ep,"D=.5.*(–9.8).*T.^2;");

/*执行MATLAB命令:

D=.5.*(–9.8).*T.^2;*/

/*

*绘制图象.

*/

engEvalString(ep,"plot(T,D);");/*执行MATLAB命令:

绘图*/

engEvalString(ep,"title('Positionvs.Timeforafalling

object');");/*执行MATLAB命令:

给图象加标题*/

engEvalString(ep,"xlabel('Time(seconds)');");/*执行MATLAB命令:

设置X轴坐标*/

engEvalString(ep,"xlabel('Time(seconds)');");/*执行MATLAB命令:

设置X轴坐标*/

engEvalString(ep,"ylabel('Position(meters)');");/*执行MATLAB命令:

设置Y轴

坐标*/

/*

*Usefgetc()tomakesurethatwepauselongenoughtobe

*abletoseetheplot.

*/

printf("Hitreturntocontinue\n\n");

fgetc(stdin);

/*

*We'redoneforPartI!

Freememory,closeMATLABengine.

*/

printf("DoneforPartI.\n");

mxDestroyArray(T);/*从内存中撤销矩阵“T”*/

engEvalString(ep,"close;");/*关闭刚才显示图象的窗口*/

/*

*PARTII

*Forthesecondhalfofthisdemonstration,wewillrequest

*aMATLABstring,whichshoulddefineavariableX.MATLAB

*willevaluatethestringandcreatethevariable.We

*willthenrecoverthevariable,anddetermineitstype.

*/

/*

*UseengOutputBuffertocaptureMATLABoutput,sowecan

*echoitback.

*/

engOutputBuffer(ep,buffer,BUFSIZE);/*构建MATLAB文本输入缓冲区*/

while(result==NULL){

charstr[BUFSIZE];

/*

*Getastringinputfromtheuser.

*/

printf("EnteraMATLABcommandtoevaluate.This

commandshould\n");

printf("createavariableX.Thisprogramwillthen

determine\n");

printf("whatkindofvariableyoucreated.\n");

printf("Forexample:

X=1:

5\n");

printf(">>");/*要求用户输入一个MATLAB命令*/

fgets(str,BUFSIZE–1,stdin);/*获得用户输入*/

/*

*EvaluateinputwithengEvalString.

*/

engEvalString(ep,str);/*执行用户输入的MATLAB命令*/

engEvalString(ep,str);/*执行用户输入的MATLAB命令*/

/*

*Echotheoutputfromthecommand.Firsttwocharacters

*arealwaysthedoubleprompt(>>).

*/

printf("%s",buffer+2);/*显示该MATLAB命令的执行情况*/

/*

*Getresultofcomputation.

*/

printf("\nRetrievingX...\n");

if((result=engGetArray(ep,"X"))==NULL)

/*判断是否可以从MATLAB引擎中获得矩阵“X”*/

printf("Oops!

Youdidn'tcreateavariableX.\n\n");

else

printf("Xisclass%s\t\n",mxGetClassName(result));

/*显示矩阵“X”的类型*/

}/*while(result==NULL)*/

/*

*We'redone!

Freememory,closeMATLABengineandexit.

*/

printf("Done!

\n");

mxDestroyArray(result);/*从内存中撤销矩阵“T”*/

engClose(ep);/*关闭MATLAB引擎*/

returnEXIT_SUCCESS;/*返回*/

}

4、引擎应用程序的编译

对于象上例中的控制台程序,可以在MATLAB命令行中直接使用带-f参数的mex命令编译。

如果在普通win32application中使用MATLAB引擎,情况则比较复杂。

在Windows中,MATLAB引擎是通过ActiveX被调用的。

因此你需要先Create一个OLEAutomationSever和一个OLEClient,然后通过OLE方式调用这个MATLAB引擎。

具体做法可参阅相关MATLAB随机文档。

5、总结

MATLAB引擎的调用与其它引擎(例如数据库引擎)的调用很类似,其步骤是联接\启动引擎,然后向引擎发送命令,获得引擎处理结果。

结束语

上面简要介绍了MATLAB与C++的几种接口方式,我们可以根据要求的不同采用相应的方式。

此外,MATLAB还提供了一个数学库,由此数学库,我们可以获得对MATLAB内部命令更多的访问权和更灵活的访问方式。

具体内容可参考MATLAB的相关随机文档。

•参考文献

1、MATLAB随机文档:

apiguide.pdf

2、MATLAB随机文档:

apiref.pdf

3、MATLAB随机文档:

c_math_ref1.pdf

VC程序员最好用visualmatcom。

VB用matrixVBmathtool在主页上提供免费试用,快去下吧。

matlab的功能可在你的VC,VB中实现,而且只需两

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

当前位置:首页 > 人文社科 > 法律资料

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

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