Wednesday, February 4, 2009

MATLAB引擎技术介绍

MATLAB的应用程序接口(API)的Engine函数库包含了许多引擎操作的函数,这些函数以Eng作为前缀,同MEX函数库和MX函数库相同,通过前缀来表明函数所在的API函数库。

1. 使用MEX文件编译Engine函数
在MATLAB安装程序的路径下,提供了一些Engine函数的演示,读者可以打开文件查看Engine文件编写的基本结构和方法。
首先拷贝:
C:\Prgoram Files\MATLAB\R2006a\extern\examples\eng_mat\engwindemo.c
文件到当前MATLAB的工作窗口中,或者直接打开MATLAB,在MATLAB命令行窗口中输入以下命令:
demofile = [matlabroot '\extern\examples\eng_mat\engwindemo.c'];
copyfile(demofile, '.');
通过which命令或者在Current Diretory目录下,可以看到engwindemo.c文件已经拷贝到当前路径下,然后选择编译属性文件,在MATLAB命令行窗口中输入以下命令:
optsfile = [matlabroot '/bin/engopts.sh'];
mex('-f', optsfile, 'engdemo.c');
或者直接使用以下的MATLAB命令行命令:
mex('-f', [matlabroot  '\bin\win32\mexopts\lccengmatopts.bat'], ‘engwindemo.c’);
编译成功后,可以看到在MATLAB的当前工作窗口中出现了一个engwindemo.exe可执行文件,在MATLAB命令行窗口中输入:
!engwindemo
通过!操作符,可以在MATLAB的命令行窗口中执行.EXE文件。

2. 在Visual C++中编译运行engine文件

#include
#include
#include
#include
//包含engine.h头文件或者精确列出文件所在,读者根据Matlab安装路径修改即可
// #include
#include "engine.h"
int main(void)
{
Engine *ep;
mxArray *temperatureValue;
double tempValue[]={0,4,6,10,12,16,22,26,30};
int length;

//开启Matlab引擎 Engine
if( !(ep = engOpen(NULL)) )
{
//MatlabEngDemo.c为保存的文件名
MessageBox( (HWND)NULL, (LPSTR)"Can't start MATLAB engine",
(LPSTR)"matlabEngDemo.c", MB_OK);
exit(-1);
}

//如果正常开启Matlab引擎,则调用引擎函数
length = sizeof(tempValue)/sizeof(double);
//初始化mxArray变量temperatureValue
temperatureValue = mxCreateDoubleMatrix(1, length, mxREAL);
//将tempValue的数值拷贝给temperatureValue
memcpy( (void *)mxGetPr(temperatureValue), (void *) tempValue, length * sizeof(double));
//将变量导入工作窗口Workspace中
engPutVariable(ep, "Temperature", temperatureValue);
//以下利用engEvalString函数调用Matlab命令
engEvalString(ep, "Density = -0.256 * Temperature.^2 + 6.16 * Temperature - 33.9;");
engEvalString(ep, "plot(Temperature, Density,'r-');");
engEvalString(ep, "title('Density vs. Temperature curve');");
engEvalString(ep, "xlabel('Temperature');");
engEvalString(ep, "ylabel('Density');");
engEvalString(ep, "grid on;");

//释放内存空间
mxDestroyArray(temperatureValue);

return 0;
}
More details could be found in my published book:
MATLAB编程基础与典型应用
北京:人民邮电出版社,2008
ISBN:978-7-115-17932-6/TP

Pls contact me with Email:lhd06@mails.tsinghua.edu.cn

No comments: