MATLAB编程与应用系列-第16章 外部接口技术(4)

本章教程共分为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所示。


图16.1.新建Win32 Console Application工程项目png

• 选择菜单栏【Tools】下的【Options】,在【Directories】属性页下,设置相关的Include文件路径,Libray文件路径和Executable文件路径。Inlcude文件路径设置为%matlabroot%\extern\include,其中%matlabroot%为读者计算机中MATLAB应用程序的安装根目录,Library文件路径设置为%matlabroot%\extern\lib\win32\microsoft, Executable文件路径设置为%matlabroot%\bin\win3,如图16.2所示。

图16.2.Visual C++中包含文件,库文件路径设置png

• 选择菜单栏【Project】下的【Setting】选项,在【Link】属性页中,添加libeng.lib,libmex.lib,libmx.lib,libmat.lib库文件,注意库文件之间使用空格而不使用逗号,否则编译会出错,如图16.3所示。


图16.3.Visual C++中Link选项设置png

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所示。


图16.4.程序运行结果png

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所示的运行结果。


图16.5.程序运行结果png

在启动的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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349