本章教程共分为7篇进行阐述:
MATLAB编程与应用系列-第16章 外部接口技术(1)
MATLAB编程与应用系列-第16章 外部接口技术(2)
MATLAB编程与应用系列-第16章 外部接口技术(3)
MATLAB编程与应用系列-第16章 外部接口技术(4)
MATLAB编程与应用系列-第16章 外部接口技术(5)
MATLAB编程与应用系列-第16章 外部接口技术(6)
MATLAB编程与应用系列-第16章 外部接口技术(7)
本系列教程来源于出版书籍《基于MATLAB编程基础与典型应用书籍》,如涉及版权问题,请联系:156204968@qq.com。 出版社:人民邮电出版社, 页数:525。
本系列教程目前基于MATLABR2006a,可能对于更高级版本的功能和函数有差异,教程中如有问题,请联系:156204968@qq.com
16.4 MATLAB引擎技术
MATLAB引擎技术主要在工作环境中安装了MATLAB应用程序的前提下实现其他语言调用MATLAB函数,这种技术一方面可以保持C,C++和FORTRAN语言的运算速度快的特点,同时可以在C,C++和FORTRAN语言中嵌入复杂的数学分析函数,比如信号处理函数,工程优化函数,FFT变换函数等,减少了C,C++和FORTRAN编程的困难。MATLAB引擎技术主要应用于以下几个方面:
在特定的应用场合下,需要采用C,C++或者FORTRAN语言进行快捷实时的运算,但是应用环境需要大量的数学分析和运算,此时,可以在C,C++和FORTRAN语言中嵌入MATLAB函数,调用MATLAB引擎。
对于一些信号分析系统,数据采集处理系统,前台需要丰富的人机接口界面,后台需要做大量的数据分析处理,那么此时可以很好地利用MATLAB引擎。前台可以使用C,C++和FORTRAN语言编写操作界面,而后台则使用MATLAB引擎,直接调用MATLAB数学函数库,一方面减少C,C++和FORTRAN语言编写相关数学算法的复杂度,保证了数学分析函数的可靠性,同时也极大缩短了应用程序开发周期。
16.4.1 Visual C++中调用MATLAB引擎配置
在Visual C++环境中调用MATLAB引擎,首先需要对Visual C++环境进行配置,按照以下步骤进行MATLAB引擎环境配置。
• 运行Microsoft Visual C++,在菜单栏【File】下选择新建一个工程文件,选择【New】,点击【Project】属性页,选择【Win32 Console Application】,给出工程文件名称,如图16.1所示。
• 选择菜单栏【Tools】下的【Options】,在【Directories】属性页下,设置相关的Include文件路径,Libray文件路径和Executable文件路径。Inlcude文件路径设置为%matlabroot%\extern\include,其中%matlabroot%为读者计算机中MATLAB应用程序的安装根目录,Library文件路径设置为%matlabroot%\extern\lib\win32\microsoft, Executable文件路径设置为%matlabroot%\bin\win3,如图16.2所示。
• 选择菜单栏【Project】下的【Setting】选项,在【Link】属性页中,添加libeng.lib,libmex.lib,libmx.lib,libmat.lib库文件,注意库文件之间使用空格而不使用逗号,否则编译会出错,如图16.3所示。
16.4.2 主要的MATLAB引擎函数
MATLAB的应用程序接口(API)函数库的Engine函数库包含了许多引擎操作的函数,这些函数以Eng作为前缀,同MEX函数库和MX函数库相同,通过前缀来表明函数所在的API函数库。表16.5所示为常用的C语言Engine函数库函数功能描述。表16.6所示为常用的FORTRAN语言Engine函数库函数。
表16.5 常用的C语言Engine函数库函数
函数名 | 功能描述 |
---|---|
engOpen |
启动MATLAB引擎 |
engClose |
关闭MATLAB引擎 |
engGetVariable |
从MATLAB引擎中获取MATLAB变量 |
engPutVariable |
将MATLAB变量传递给MATLAB引擎 |
engEvalString |
执行MATLAB字符串命令 |
engOutPutBuffer |
创建一个MATLAB缓冲区来存储MATLAB的文本输出 |
engSetVisible |
设置显示或者隐藏MATLAB引擎 |
表16.6 常用的FORTRAN语言Engine函数库函数
函数名 | 功能描述 |
---|---|
engOpen |
启动MATLAB引擎 |
engClose |
关闭MATLAB引擎 |
engGetVariable |
从MATLAB引擎中获取MATLAB变量 |
engPutVariable |
将MATLAB变量传递给MATLAB引擎 |
engEvalString |
执行MATLAB字符串命令 |
engOutPutBuffer |
创建一个MATLAB缓冲区来存储MATLAB的文本输出 |
16.4.3 实例演示
在了解MATLAB引擎相关函数和Visual C++环境配置后,在本小节中将通过两个实例分别演示在MATLAB环境下使用MEX命令编译Engine函数和在Visual C++环境下编译运行Engine函数。
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命令可以看到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文件,文件运行后的结果如图16.4所示。
2. 在Visual C++中编译运行MATLAB Engine
按照16.4.1节中Visual C++调用MATLAB引擎的配置方法,对VC环境进行配置,配置成功后,建立工程项目文件,就可以编译运行MATLAB引擎。实例matlabEngDemo.c为一个简单的调用MATLAB应用实例。
/*
* matlabEngDemo.c
*/
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
//包含engine.h头文件或者精确列出文件所在,读者根据Matlab安装路径修改即可
// #include <C:\Program Files\MATLAB\R2006a\extern\inlcude\engine.h>
#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;
}
编译运行程序后,可以得到如图16.5所示的运行结果。
在启动的MATLAB命令行窗口中。使用whos命令,查看当前工作窗口中的变量,结果如下所示:
>> whos
Name Size Bytes Class
Density 1x9 72 double array
Temperature 1x9 72 double array
Grand total is 18 elements using 144 bytes
作者:德特数据
联系方式:156204968@qq.com