VisuaI Studio与MATLAB协同编程方法研究

2016-12-21 00:55袁培燕宋明阳
计算机教育 2016年9期

袁培燕+宋明阳

摘要:Visual Studio(vs)与MATLAB协同编程技术充分结合了前者在程序设计方面的灵活性与后者强大的数学函数库功能,优势互补。然而,该结合在工程实践方面偏弱,不利于两者的大规模应用。针对该问题,文章基于VS与MATLAB协同编程的3种方案,通过具体实例详细阐述两者协同编程的实现步骤,分析了3种方案各自的优缺点,以期降低初学者的学习门槛。

关键词:Visual Studio;MATLAB;协同编程;DLL文件;COM组件

0引言

Visual Studio(VS)是一款面向对象的程序开发平台,它通过生成程序框架减少编程人员的工作量,通过可视化的图形开发控件设计简洁美观的软件界面,并支持多种编程语言,具有较好的程序设计灵活性和用户体验友好性,但在数学运算和函数绘图方面存在不足之处。

MATLAB作为专业的数学软件,具有高效的数学运算能力和强大的函数图形处理能力,是实验室中一款常用的专业软件。然而,由于其专业性较强、用户界面操作复杂,用户的体验友好度不高。

在程序设计中,有效结合VS良好的用户体验性、程序设计灵活性和MATLAB强大的数学函数库,可以充分发挥双方的优点。但现有的VS与MATLAB协同编程工作侧重于相关学术理论知识,在工程实践方面的应用不够深入。本文针对MATLAB引擎法、DLL文件法和COM组件法3种方案,结合实例重点描述VS与MATLAB协同编程的具体操作方法和详细步骤,最后通过对比实验过程和实验结果,阐述3种方案各自的优点和不足。

1.MATLAB与VS协同编程方法简介

1.1VS调用MATLAB引擎的方法

MATLAB引擎是一组API函数接口,用户可以使用这组接口以发送脚本命令的方式调用MATLAB中的函数。在具体实例中,C/C++程序作为前端,可以向作为后台的MATLAB引擎发送控制命令,MATLAB引擎根据控制命令的种类做出不同的响应。这种方法的实质是ActiveX控件调用MATLAB进程。

1.2VS调用DLL文件的方法

DLL文件即动态链接库文件,是应用程序的一部分。exe程序启动时,与之对应的DLL文件会被调用。MATLAB自带编译器,用户可以借助该编译器把已经编写好的*m文件编译为DLL文件,然后在C/C++程序中直接使用DLL文件中写好的MATLAB函数。

1.3VS调用COM组件的方法

COM组件,即组件对象模型,是一种通用的对象接口模型,适用于任何语言。任何语言的程序通过生成COM组件都可以被其他语言程序调用。而MATLAB的编译器可以把用户编写的*m文件编译为COM组件,供其他平台程序使用。

2.MATLAB与VS协同编程的实现

2.1实验-MATLAB引擎法

在VS2010中建立MFC工程,以向MATLAB引擎发送命令的方式实现协同编程。

2.1.1前期配置

1)系统环境变量配置。

在“我的电脑→属性→高级→环境变量→用户变量/系统变量→PATH”选项中添加路径:\bin:\bin\win64。

2)VS2010环境配置。

(1)首先建立一个基于对话框程序的MFC工程,工程名为test。

(2)设置工程目录,设置方法如下:

在“项目→test属性页→配置属性→VS2010目录→包含目录”选项中添加\extemkinclude;

在“项目→test属性页一配置属性→VS2010目录→库目录”选项中添加\extem\lib\win64/kmicrosoft;

在“项目→test属性页→配置属性→c/c++一常规一附加包含目录”选项中添加\extemklib\win64haaicrosoft和\extemkinclude;

在“项目→test属性页→配置属性→链接器>常规→附加库目录”选项中添加\extem\lib和\extem\lib\win64hnicrosofl;

在“项目→test属性页→配置属性→链接器>输入>附加依赖项”选项中添加4个1ib文件,分别是libmx.1ib、libmat.1ib和libeng.1ib、mclmcrrt.1ib;

在“项目→test属性页→平台”选项中选择X64选项(只针对64位版本的MATLAB)。

2.1.2代码编写

(1)在testDlg.cpp文件中添加#include“engine.h”。

(2)在对话框界面上添加按钮控件,为其增加消息响应函数,代码如下所示:

2.1.3实验结果

编译运行程序,单击确定按钮会弹出窗口,其中显示了正弦函数和余弦函数的直角坐标系图形,如图1所示。

该方法虽然功能全面、编码简单,但exe程序运行时需要MATLAB在后台运行,脱离不了MATLAB环境,造成了运行速度慢、程序执行效率低的问题。

2.2实验二调用DLL文件法

将用户自定义的*m文件通过MATLAB自带的编译器编译为DLL文件。在VS2010中建立基于对话框的MFC程序,然后调用DLL文件中的MATLAB函数。

2.2.1前期配置

(1)实验一的全部前期配置步骤。

(3)配置MATLAB编译环境并导出DLL文件。在MATLAB的Command window中输人mbuild-setup命令,选择VS2010编译器,并输入y进行确认;接下来,将Current Folder目录修改为m文件所在的目录,然后向Command window输入mcc-w cpplib:xinQPCAfootball-T link:libxinQPCAfootball.m命令(本文使用的m文件名为xinQPCAfootball.m);完成以上步骤后,xinQPCAfootball.m所在目录中会产生库文件所需文件,将这些文件全部复制到MFC工程目录下。

(4)设置工程目录。在“test属性页一配置属性→链接器→输入→附加依赖项”选项中添加m文件编译后生成的lib文件,如xinQPCAfootball.m文件编译后生成的xinQPCAfootball.lib文件。

在“项目→test属性页→配置属性→链接器→常规→附加库目录”选项中添加

2.2.2代码编写

在testDlg.cpp文件中添加头文件#include”xinQPCAfootball.h”。添加成功之后打开它可以找到用户在*m文件中编写的MATLAB函数的接口,如下所示:

extem LIB_xinQPCAfootbalLCPP_API void MW-CALL-CONV xinQPCAfootball(int nargout,mwArray&f)

在对话框界面上添加按钮控件并增加消息响应函数,在其中调用该接口函数,代码如下所示:

void CtestDlg::OnBnClickedOk20

mwArray a(1100,100,mxDOUBLE_CLASS);

xinQPCAfootballlnitializeo;

xinQPCAfootball(NULL,a);

2.2.3实验结果

编译运行程序,单击确定按钮会弹出窗口,其内容为正弦函数和余弦函数的极坐标图形,如图2所示。

该方法生成的exe程序在运行时不需要启动MATLAB,可以提高程序运行效率。但前期配置步骤较为复杂且易出错。

2.3实验三调用COM组件法

通过MATLAB中自带的编译器将用户自定义的*m文件编译为COM组件,在VS2010中建立基于对话框的MFC工程,然后用该程序调用COM组件实现协同编程。

2.3.1前期准备

(1)创建community.m文件,其内容为画一个绿色的圆柱螺旋线,代码如下所示:

(2)在MATLAB的Command window中输入mbuild-setup命令,选择VS2010编译器的选项。

(3)在Command window中继续输入deploytool出现名为Deployment Project的界面,其中,Name和Location选项可以自定义,而Type选项需要选择Generic COM component;点击OK出现名为Generic COM Component的界面;点击Add classes并输入类名,如输入类名为test;点击Add files添加*m文件,如添加community.m文件。

点击build图标开始生成COM组件;生成成功后会在Location目录下生成文件夹,在该文件夹的src文件夹中可以找到调用COM组件所需的3个文件:wmCOMtypes.h、test idl.h、testidl_i.c。

(4)建立基于对话框的MFC工程,在界面上添加按钮并创建消息响应函数,将3个COM组件文件复制到该工程目录下。

(5)在“项目→test属性页→配置属性→C/c++→预编译头”选项中选择“不适用预编译头”。

2.3.2代码编写

2.3.3实验结果

编译运行程序,单击确定按钮会弹出窗口,内容为一个圆柱螺旋线,如图3所示。

使用COM组件的协同编程方法拥有较为简单的前期配置步骤,并包含较为全面的MATLAB功能,也可以独立于MATLAB环境运行,是一种较为理想的协同编程方法。