Matlab与C_C_的接口及其在仿真中的应用
- 格式:pdf
- 大小:161.44 KB
- 文档页数:5
邮局订阅号:82-946360元/年技术创新软件时空《PLC 技术应用200例》您的论文得到两院院士关注Matlab 与VC 通用接口程序的实现General Interface Device Between Matlab and VC(华侨大学)彭长青尚荣艳PENG Chang-qing SHANG Rong-yan摘要:Matlab 编程效率极高,但执行效率非常低;Visual C 开发功能强大,执行速度快,但编程繁琐。
Matcom 可以实现Matlab 和VC 的完美结合。
本文探讨了基于Matcom4.5的VC 与Matlab 接口程序的实现问题,从建立文档方式和建立文本框方式两种角度,详细介绍了将CPP 代码插入VC 的框架,即建立Matlab 和VC 的通用接口程序的方法。
该方法实现了Matlab 与VC 程序的混合编制,具有一定的实用价值。
关键词:Matlab ;VC ;Matcom4.5;接口程序中图分类号:TP311.1文献标识码AAbstract:Matlab programming is extremely efficient,but its execution efficiency is very low.Visual C can develop powerfully and ex -ecute fast,but its programming is very tedious.Matcom can achieve the perfect combination of Matlab and VC.The paper empha -sizes the realization of the interface program between Matlab and VC based on Matcom4.5.The framework to insert CPP code into VC is introduced in detail by establishing a document and establishing a text toolbar,which is the method to establish a general in -terface device between Matlab and VC.The method achieves the mixed programming technology for Matlab and VC and has certain value in practice.Key words:Matlab;VC;Matcom4.5;Interface Device文章编号:1008-0570(2010)09-3-0105-031引言Matlab 是MathWorks 公司推出的一套功能非常强大的商业数学软件,广泛应用到信号处理、语音处理、数据采集、数值运算、图像处理、电子仿真、金融分析等工业领域。
基于COM组件的Matlab7.x与VC++6.0接口技术及实际
应用
李芳;徐丽
【期刊名称】《计算机应用与软件》
【年(卷),期】2009(026)002
【摘要】介绍了MATLAB7.x与VC+ +6.0四种接口方法,分析比较了各种方法的优缺点.在此基础上,着重研究了基于COM组件的接口技术,详细阐述了利用COM 组件进行接口的配置、步骤和方法.使用此接口技术,完成了某数值仿真平台的实例开发,较好地实现了Matlab7.x强大的计算功能与VC+ +6.0卓越的可视化功能的高效结合,大大提高了数值仿真软件的开发效率.
【总页数】4页(P131-134)
【作者】李芳;徐丽
【作者单位】长安大学信息工程学院,陕西,西安,710064;长安大学信息工程学院,陕西,西安,710064
【正文语种】中文
【中图分类】TP3
【相关文献】
1.基于COM组件的VB与MATLAB接口编程(续) [J], 黄锡泉;龙艺秋
2.基于COM组件的VB与MATLAB接口编程 [J], 黄锡泉
组件在基于VB与MATLAB的控制器接口程序中的应用 [J], 赵旭阳;米文
鹏;洪成华;曹娟
4.基于S3C2440与VC++6.0的液晶显示器光电参数检测接口系统的设计 [J], 李伟
5.基于COM组件ADO数据库接口 [J], 焦广伦
因版权原因,仅展示原文概要,查看原文内容请购买。
浅析VC与matlab接口编程(一)作者:孙科除了使用MATCOM之外,matlab与vc的混合编程还有其他的几种方法:1 通过matlab engine方式。
此种方法需要在机器上安装matlab软件,而且执行效率低,因此在实际应用中不常采用这种方法,在软件开发中也不可行,比较适合个人使用或做演示用。
2 直接调用matlab的c/c++数学函数库。
vc中可以直接使用matlab提供的c/c++数学函数,此方法需要对c/c++语言非常熟悉。
3 用matlab自带的matlab compiler.此种方法有很多限制:(1)不能转换脚本m文件,只能转换m函数;(2)不能使用matlab对象;(3)不能用input或者eval操作matlab空间变量;(4)不能动态的命名变量,然后用load或者save命令来操作,不能对使用load指令装载普通文本文件的m文件操作;(5)不能处理具有嵌套调用其他m文件的m文件;(6)不能使用matlab内联函数(7)不能对使用了java接口的matlab代码文件使用4 使用matlab的combuild工具:该方法简单,通用性强,几乎可以使用matlab的任何函数,因此在程序较大,调用函数较多时使用起来效果很好,此方法也是mathworks公司推荐的使用方法;5 使用matcom工具。
相比其他方法而言,有下列优点:(1)转换过程简单,容易实现;(2)可以方便的生成dll和exe文件;(3)不仅可以转换独立的脚本文件,也可以转换嵌套的脚本文件;(4)设置环境后,可以使用matlab工具箱函数;其缺点是:(1)对struct等类的支持有缺陷;(2)部分绘图语句无法实现或得不到准确的图像,尤其是三维图像。
在不涉及到三维作图以及m文件不大的情况下,使用效果很好。
Matcom是mathTools公司推出的一个能将M文件转化成相同功能C++代码的工具。
相比Matlab自带的编译器Compiler,用Matcom转化代码要简单和方便得多。
基于COM接口的VC++与MATLAB混合编程摘要介绍了VC++与Matlab混合编程的各种方法,并分析了各种方法的优缺点。
以FFT算法为例,给出了基于COM接口的VC++与Matlab混合编程的步骤。
关键词 VC;COM;Matlab;FFT;混合编程0 引言目前,Matlab广泛的应用于自动控制、数学运算、信号分析、图像处理、财务分析等各行各业。
MATLAB也存在着某些缺点:Matlab是一种解释性语言,其特点是以矩阵为基本数据结构,导致其执行效率相对C或C+ +语言要低很多;因为Matlab程序不能脱离其环境运行,故不能直接用于商用软件的开发。
与此相反,VC++由于其丰富得人机界面,高效的执行效率已经成为基于Windows平台下开发商业软件的必备工具。
然而,VC++对于复杂的数值运算就有点“力不从心”了。
所以将VC++与Matlab完美的结合,发挥各自的优势具有现实意义。
自Matlab6.5版本开始,新推出来的Combuilder支持把用Matlab编写的程序做成com组件,供其他语言调用。
该方法实现简单,通用性强,成为VC与Matlab混合编程最有效的方法。
1 VC与Matlab混合编程的方法1.1 通过Matlab Engine方式Matlab Engine是指一组Matlab提供的接口函数,支持C语言, Matlab Engine采用C/S(客户机/服务器)模式,Matlab作为后台服务器,而C程序作为前台客户机,通过Windows的动态控件与服务器通信,向Matlab Engine传递命令和数据信息,从Matlab Engine接受数据信息。
用户可以在前台应用程序中调用这些接口函数,实现对Matlab Engine的控制。
采用这种方法几乎能利用Matlab全部功能,但是需要在机器上安装Matlab软件,而且执行效率低,因此在实际应用中不采用这种方法,在软件开发中也不可行,这种模式只适合个人使用或做演示。
Matlab程序在VC中的调用摘要:利用vc与matlab接口技术,用VC 调用Matlab 编译的DLL 文件进行复杂数据处理不仅简洁通用,更具有很强的实用性和可扩展性,在科学计算与工程运用领域具有广泛的推广应用价值。
关键词:MATLAB ;VC;DLL ;接口1. VC与MATLAB简介VC 是大家都非常熟悉的一个软件,它是MicroSoft公司开发的在Windows 环境下主要软件开发环境之一,用其中的MFC 可以快速方便地编写出各种友好的用户界面,且用VC ++ 开发的系统具有容易维护升级、界面友好,代码效率高、执行速度快等一系列优点,因此已成为目前应用软件开发中的主流工具之一。
①、MATLAB是Mathworks 公司开发出的一款著名软件,如今已成为世界上使用最广泛的数学软件,它具有强大的数值计算、数据处理、图象显示、符号运算、系统分析、模拟仿真功能,由于受到各个领域专家学者的青睐,在他们的共同努力下,经过多年的发展,如今的Matlab 不仅拥有功能完善的内部函数库,更有专用于各领域的强大工具包,在这个平台上只需寥寥数语便可完成在其它环境中复杂度不可想象的功能;另外,开放性也是Matlab 一个最重要、最受欢迎的特点,除内部函数外,所有Matlab 工具包中主包文件和各工具包文件都是可读可改的源文件,用户可通过对源文件的修改来形成新的工具包,甚至亦可完全由自己编写源文件来构筑自己研究领域的专用工具包。
在欧美发达国家中,Matlab 已经成为应用线性代数、自动控制理论、数理统计、数字信号处理、时间序列分析、动态系统仿真等高级课程的基本教学工具;成为攻读学位的大学生、硕士生、博士生必须掌握的基本技能;在设计研究单位和工业部门,Matlab 也被广泛地用于研究和解决各种具体工程问题。
Matlab在中国得到充分的重视,在各科研机构和高校中得到大量的使用。
2 利用VC 与MATLAB接口实现matlab程序在VC中的调用(1) 在Matlab 环境中编写. m 文件。
VC与Matlab的接口技术1、Matlab 是由Math Works 公司于1984 年推出的数值计算及图形处理软件,可以实现数值分析、优化、统计、偏微分方程数值解、自动控制、信号处理、图像处理等若干领域的计算和图形显示功能。
其中,控制系统工具箱的集成为设计和分析各种复杂的控制系统提供了有效的方法和途径。
但是,由于Matlab开发平台的局限性,在其上面开发的程序不能脱离Matlab运行环境,因而在处理一些实际应用问题时显得灵活性不足,而VC++则在一定程度上能够弥补这一漏洞,因此,现将二者结合共用,各献其长,可以为科研工作和工程开发提供了更为强大的技术支持。
Matlab引擎是Matlab提供的一系列程序的结合,它允许用户在自己的应用程序中对Matlab进行调用,将Matlab作为一个操作引擎使用,使其在后台运行。
一般Matlab 引擎采用客户机/ 服务器(Client/ Sever) 计算方式,就是一种把应用处理负载分布到客户机和服务器上的一种计算模式,客户机和服务器既可以是存在于同一台计算机,也可以通过网络来实现信息共享。
一般情况下,客户机是运行前端软件的PC机,并且知道如何与服务器通信,服务器与此相对应,是接收请求信息,并采取相应行的机器。
由于客户机和服务器共同承担处理负载,使系统总体性能大为提高。
在实际应用过程中,把VC的C语言或C + + 语言的程序作为前端客户机程序,它从Matlab 引擎接收数据信息,并与引擎传递命令的数据信息。
表1是几种常用的Matlab引擎调用函数。
2、通过Matlab引擎用户可以完成以下任务:首先,可以将Matlab作为一个功能强大的和可编程的数学函数库,调用Matlab中的大量的数学计算函数,完成复杂的计算任务;其次,可以为一个特定的任务构建一个完整的系统,前台的用户界面用高级语言编写,后台的计算任务由Matlab引擎来完成;最后,用户不但可以在本地计算机上调用Matlab引擎,而且还可以通过网络调用其它计算机上的Matlab引擎,这样可以很好的实现资源的共享和作业的分工合作。
MATCOM在VC++与MATLAB混合编程中的应用摘要:介绍了使用MATCOM实现VC++与MATLAB混合编程的优势和方法,并给出了实例。
关键词:MATCOM、MATLAB、混合编程引言MATLAB是MathWorks公司于1982年推出的一种以矩阵为基本运算单位的高效数值计算软件,带有功能强大的数学函数库,并开发有多种学科领域的工具箱函数库,广泛地应用于科学研究与工程计算。
然而,MATLAB自身存在的一些缺点限制了它在更多方面的应用:(1)MATLAB程序不能脱离其运行环境,可移植性差(2)MATLAB是一种解释性语言,语言执行效率低,实时性较差(3)MATLAB的界面开发能力较差,难以开发出友好的应用界面(4)MATLAB编写的M文件是文本文件,容易被直接读取,难以保护劳动者的成果VC++用于面向对象的可视化编程,可以完成从底层软件直到面向用户软件等各种应用程序的开发。
利用它提供的各种实用工具,开发者可以轻松开发出高效强大的Windows应用程序。
但在实际工程开发中,与MATLAB相比:(1) VC++在数值处理分析和算法工具等方面不如MATLAB(2) VC++在准确方便地绘制数据图形(数据可视化)方面不如MATLAB因此,把MATLAB在数值计算、算法设计以及数据可视化等领域的优势与VC++应用系统集成,不仅可以完全满足系统在数据运算与表现方面的需求,而且还可提高系统处理的效率和稳定性,同时也减少了开发人员实现算法的困难,缩短了软件开发的周期,提高了软件质量,在实践中具有很高的使用价值。
VC++与MATLAB混合编程方法在VC++下调用MATLAB,主要有以下三种方法:1) 利用MATLAB引擎MATLAB Engine库是MathWorks公司提供的一组函数库,它提供了一种在用户程序进程中与独立的MATLAB进程通讯的方法,在Windows下使用ActiveX技术实现。
MATLAB Engine不仅可以调用MATLAB中的C\C++函数,还可以调用工具箱中的函数,应用程序整体性能较好,同时,MATLAB Engine方式可利用MATLAB强大的图形功能;但该种方式的致命缺陷是不能脱离MATLAB运行环境。
产吐与科技论土云2019年第18卷第6期VC调用MATLAB引擎实现核反应堆复杂控制仿真的方法及应用□王克成孙启航李方立李健张倬【内容摘要】核反应堆自动控制仿真是通过模拟核反应堆内链式核裂变反应及热量传递过程以及自动控制方案,验证控制算法的有效性,涉及核反应堆物理、数学、热力学、自动控制、计算机以及信息等多学科领域的综合性技术。
本文提出了一种基于VC和MATLAB的核反应堆自动控制仿真方法。
用VC计算程序模拟核反应堆物理热工过程,用MAT-LAB/Simulink模型实现核反应堆控制算法,重点解决VC与MATLAB/Simulink之间的接口,实现超实时仿真计算。
结果表明,本仿真平台能够充分发挥VC程序对物理热工过程模拟的优勞以及MATLAB/Simulink模型对复杂控制算法模拟的优势,对控制系统设计提供有力支撑。
【关键词】核反应堆;VC;MATLAB;控制仿真【作者简介】王克成(1986~),男,河北唐山人;中国核动力研究设计院工程师;研究方向:反应堆仪控系统设计孙启航,李方立,李健,张倬;中国核动力研究设计院—、引言在核动力装置控制系统设计阶段,为了初步确定核反应堆自动控制参数或验证自动控制算法的有效性,通常在理论分析基础上,借助全数字化仿真平台进行仿真计算。
全数字控制仿真采用基于软件的核反应堆物理热工过程模拟程序,同时应用虚拟控制设备代替实际控制器,可以有效节约工程研制经费,同时具有较高的灵活性、可扩展性和工作效率。
描鼠标表面,利用云技术将数据点导入至Imageware进行处理,如此便可以获得点云图形,并且保存为igs格式,将其导入到CAD软件中,展开点云处理与三维重构这两项操作。
第一步,明确实物形状所属曲面形式;第二步,通过Im-ageware软件进行逆向处理,具体处理数据按照“点——曲线、曲面”这一步骤。
对于点云数据的处理,建议使用Imageware软件,将扫描获得的点云文件调入其中,按照点云特点做辅助基准,对其图像点云方位,为之后的截面线截取奠定基础。
Matlab与C/C++混合编程接口及应用摘要:Matlab具有很强的数值计算和分析等能力,而C/C++是目前最为流行的高级程序设计语言,两者互补结合的混合编程在科学研究和工程实践中具有非常重要的意义。
从Matlab调用C/C++代码及C/C++调用m文件两方面,深入地研究了它们之间混合编程的原理和实现机制,并且给出了具体条件下的混合编程方法和步骤。
实验表明,给出的Matlab与C/C++混合编程接口及应用方法是有效、实用的。
1引言Matlab是当前应用最为广泛的数学软件,具有强大的数值计算、数据分析处理、系统分析、图形显示甚至符号运算等功能[1]。
利用这一完整的数学平台,用户可以快速实现十分复杂的功能,极大地提高工程分析计算的效率[2][3]。
但与其他高级程序[3]相比,Matlab 程序是一种解释执行程序,不用编译等预处理,程序运行速度较慢[4]。
C/C++语言是目前最为流行的高级程序设计语言之一[5]。
它可对操作系统和应用程序以及硬件进行直接操作,用C/C++语言明显优于其它解释型高级语言,一些大型应用软件如Matlab 就是用C语言开发的。
在工程实践中,用户经常遇到Matlab与C/C++混合编程的问题。
本文基于Matlab 6.5和VC6.0开发环境,在Windows平台下就它们之间的混合编程问题进行深入研究并举例说明。
2 Matlab调用C/C++Matlab调用C/C++的方式主要有两种:利用MEX技术和调用C/C++动态连接库。
在Matlab与C/C++混合编程之前,必须先对Matlab的编译应用程序mex和编译器mbuild 进行正确的设置[1]:对Matlab编译应用程序mex的设置:Mex –setup.对Matlab编译器mbuild的设置:Mbuild –setup.2.1调用C/C++的MEX文件MEX是Matlab Executable的缩写,它是一种“可在Matlab中调用的C(或Fortran)语言衍生程序”[6]。
第26卷第2期 计算机应用与软件Vol 126No .22009年2月 Computer App licati ons and Soft w are Feb .2009基于COM 组件的M a tlab7.x 与VC ++6.0接口技术及实际应用李 芳 徐 丽(长安大学信息工程学院 陕西西安710064)收稿日期:2007-08-22。
李芳,讲师,主研领域:数据库应用技术,人机交互技术,操作系统应用技术。
摘 要 介绍了MAT LAB7.x 与VC ++6.0四种接口方法,分析比较了各种方法的优缺点。
在此基础上,着重研究了基于COM 组件的接口技术,详细阐述了利用C OM 组件进行接口的配置、步骤和方法。
使用此接口技术,完成了某数值仿真平台的实例开发,较好地实现了M atlab7.x 强大的计算功能与VC ++6.0卓越的可视化功能的高效结合,大大提高了数值仿真软件的开发效率。
关键词 MAT LAB VC ++6.0 C OM 接口O N TECHNOLO GY O F I NTERFACE BET W EEN M AL TAB7.X AND VC ++6.0BASEDO N COM AND I TS ACTUAL APPL ICAT IO NL i Fang Xu L i(School of Infor m ation,Chang ’an U niversity,X i ’an 710064,Shaanxi,China )Abstract Four methods for the interface bet w een MAT LAB7.x and VC ++6.0are intr oduced,and their advantages and disadvantages are analyzed .The interface technol ogy based on COM is studied s pecially,and the app r oaches of configurati on and p r ocedures f or this interface are p resented in detail .Certain nu merical si m ulati on s oft w are is devel oped with this interface technol ogy .The research results show that the power 2ful calculati on ability ofMAT LAB7.x and excellent visual functi on of VC ++6.0can be perfectly combined t o devel op efficiently the si m ula 2ti on s oft w are with this interface technol ogy .Keywords MAT LAB VC ++6.0 COM I nterface0 引 言M atlab 是美国Math works 公司开发和发行的一个软件产品。
::首页>> 文档中心>> 在线杂志>> 其它[ 在线杂志第42期][ 原创文档本文适合中级读者已阅读231次]浅析VC与Matlab联合编程(二)作者:邓科下载源代码在“浅析VC与Matlab联合编程(一)”中简单介绍了VC与matcom的接口编程,实现本功能,要真正熟练使用接口编程,还要对函数调用有一定了解。
本文通过一个实例,较详细的介编译后的函数。
首先新建一个函数huatu.m,该函数的功能是:接受用户输入的左端点值和右端点值两个输图形。
函数还将生成两个随机数,作为一个点的坐标在图中打印出来(绿点),用来说明如何在步骤如下:1.建立一个名为Example2基于对话框的MFC(exe)工程。
2.在matcom中新建一个名为huatu.m文件,如图1;图13.在matcom命令窗口中运行该函数,如图2;图24.将生成的huatu.h、huatu.cpp(默认位置为安装目录:\matcom45\samples\Debug)和ma 为安装目录:\matcom45\lib)四个文件拷贝到建立的工程Example2目录下。
5.将第四步拷贝的四个文件加入到VC工程中:工程->添加工程->文件,选择刚才拷贝到Exa 成后如图3;图36.在Example2dlg.cpp中添加头文件:(如图4所示)#include "matlib.h"#include "huatu.h"图47.为工程建立界面:添加一个Button按扭控件;添加四个Edit box控件,用于显示数据;添加显示文字,一个显示图形,将显示图形的Static text的ID设置为ID_PIC。
其他所有控件属性保适当调整显示图形Static text控件的边缘)。
如图5所示图58.按Ctrl+W为控件添加变量。
如图6所示图69.为Button1按钮添加响应代码。
如图7所示图710.运行程序,输入左端点和右端点,点击”画图”按钮,结果如图8所示。
混合编VMatlab本文主要介绍VC与Matlab混合编程的两种方法,并详细介绍了VC向Matlab传递复杂数据:结构体的方法,有详细代码说明。
Matlab 主要面对科学计算、可视化以及交互式程序设计的高科技计算环境,但由于Matlab开发平台上开发的程序不能脱离Matlab运行环境,因而在处理一些实际应用问题时显得灵活性不足,而VC++则在一定程度上能够弥补这一漏洞,因此,将二者结合共用,各献其长,可以为科研工作和工程开发提供更为强大的技术支持。
Matlab作为控制系统设计的一种通用工具,它可以很方便的和VC进行连接。
一般而言,Matlab与VC混合编程的实现方法有很多种,这里主要介绍以下两种:1. VC调用Matlab Engine的方式:Matlab Engine是一组Matlab提供的接口函数,支持C/C++语言,Matlab Engine采用C/S(客户机/服务器)模式,Matlab 作为后台服务器,而C/C++程序作为前台客户机,向Matlab Engine传递执行命令和数据信息,从Matlab Engine接收执行结果。
用户可以在前台应用程序中调用这些接口函数,实现对Matlab Engine的控制。
采用这种方法几乎能利用Matlab全部功能,但是需要在机器上安装Matlab软件,缺点是执行效率较低。
下面简单介绍下这种方式的实现步骤:1.1 API接口介绍先来介绍一组Matlab提供的引擎API接口:(仅作简单功能介绍,详细参数说明请参考Matlab帮助)Engine* engOpen(const char* startcmd)启动Matlab引擎int engClose(Engine* ep) 关闭Matlab引擎int engEvalString(Engine* ep, const char* string)执行Matlab表达式mxArray* engGetArray(Engine* ep, const char* name)获取一个变量数组的值int engPutArray(engine* ep, const mxArray* mp)设置一个变量数组的值int engPutVariable(Engine *ep, const char *name, const mxArray *pm)同上mxArray *engGetVariable(Engine *ep, const char *name)获取一个变量int engOutputBuffer(Engine* eP,char* p,int n)获取输出字符串1.2 VC环境配置要想在VC集成环境下调用Matlab引擎实现VC和Matlab的混合编程,一般需要经过以下几个必要的步骤:(以下以Matlab2008a和VS2005版本为例)(1)添加include路径:将“\extern\include”(在Matlab的安装路径下)路劲添加到VC编译器的include下(2)添加lib路径:将“\extern \lib\win32\microsoft”(在Matlab的安装路径下) 路径添加到VC编译器的lib下(3)加载lib:需要加载至少libmx.lib、libmat.lib、libeng.lib三个库(4)include头文件:在要使用engine 函数的地方包含engine.h头文件1.3 引擎调用接下来就可以在VC中调用Matlab引擎了,简单的示例代码如下:#include 敜杮湩?屨#pragma comment(lib, libeng.lib)comment(lib, libmx.lib)#pragma#pragma comment(lib, libmat.lib)void TestDeno(){Engine* pEng = NULL;if (!(pEng = engOpen(NULL))){printf(作数?慭汴扡攠杮湩?慦汩尡);return;}//call Engine plot A*sin(t)+B A=2 B=1mxArray *A = NULL;double init = 2;A = mxCreateDoubleMatrix(1, 1, mxREAL);memcpy((void*) mxGetPr(A), (void*)&init, sizeof (double)); engPutVariable(pEng, ?, A);init = 1;memcpy((void*) mxGetPr(A), (void*)&init, sizeof (double)); engPutVariable(pEng, ?, A);mxDestroyArray(A);Sleep(3*60*1000);engEvalString(pEng, 瑜??金?瀻潬???楳????);if(NULL != pEng){engClose(pEng);}}引擎,绘制正弦曲线,相对简单,就不再详细解释,效图如下:Matlab调用VC示例代码通过.2. VC调用Matlab DLL的方式DLL是一个可执行的二进制文件。
VC与Matlab接口在魔方仿真中的应用王涛【期刊名称】《电脑知识与技术》【年(卷),期】2013(000)025【摘要】通过Visual C++与Matlab混合编程,在VC++编辑环境中调用Matlab引擎库,实现对仿真魔方还原的实时显示,可发挥Visual C++开发环境强大,执行速度快,软件自动生成和可视化的资源编辑功能,又可以充分发挥Matlab强大的数值计算、数据处理、系统分析、图形显示,甚至是符号运算功能,大大简化了C语言直接编程的繁琐,提高了开发效率。
%The mixing programming of Visual C++and Matlab can achieve the real-time reduction display in cube simulation by calling the Matlab engine library in the VC++ editing environment. The combination can not only play powerful develop-ment environment, fast execution, the software automatically generates and visual resource editing features of Visual C++, but al-so fully exert powerful numerical calculation, data processing, system analysis, graphics, and even symbolic computation capabili-ties of Matlab. It also greatly simplifies the complicated programming directly inC language and improves the efficiency of devel-opment.【总页数】5页(P5730-5734)【作者】王涛【作者单位】同济大学电子与信息工程学院,上海,201804【正文语种】中文【中图分类】TP312【相关文献】1.MATLAB和VC混合编程在时滞混沌系统仿真中的应用 [J], 赖宏慧2.Matlab与C/C++的接口及其在仿真中的应用 [J], 周正人;张凤霞;赵振宇3.VC与Matlab混合编程技术在现代控制理论系统仿真中的应用 [J], 蔡浩宇;王红波;杨树仁;刘锦廉;索辉4.MATLAB&VC++混合编程在HIFU声场仿真中的应用 [J], 陶砚蕴;单鸣雷;徐萃华5.MATLAB程序接口在控制理论仿真中的应用 [J], 陈正涛因版权原因,仅展示原文概要,查看原文内容请购买。
文章编号:1671-637Ò(2002)04-0040-05Matlab 与C /C ++的接口及其在仿真中的应用周正人, 张凤霞, 赵振宇(中国航空工业洛阳电光设备研究所,河南洛阳 471009)摘 要: 介绍了如何利用Matlab 与C /C ++的接口将现有的C 程序代码导入到Matlab 中使用,以及将Matlab 的m 文件导出到VC 中,从而可以利用Matlab 和VC 的各自优势进行仿真软件的开发。
这能够大大提高开发效率。
关 键 词: Matlab; 接口; m 文件; 仿真中图分类号: TP 31; TP 39 文献标识码: BMatlab C /C ++interface and itsapplication in simulationZHOU Zheng-ren, ZHANG Feng-xia, ZHAO Zhen-yu(Luoyang I nstitute of E lectro -optical Equipment , Luoyang 471009, China )Abstract : This paper introduces how to import current C codes to Matlab and export Matlab m files to VC by the Matlab C/C++interface.In this way,simulation software can be developed with the integrated superiority of Matlab and VC ,and the developing efficiency can be increased .Key Wor ds : Matlab ; interface ; m file ; simulation0 引言Matlab 是个功能完善的自包容程序设计和数据处理集成环境,在科学运算、数据处理、系统分析、控制系统和科学绘图领域,使用Matlab 具有非常明显的优势。
使用它提供的功能、内建函数以及工具箱,无需借助外界的任何帮助,就可高效完成任务。
在这个环境中,只需寥寥数语就可以完成十分复杂的功能,在易学易用、编程效率、可读性、可移植性和可扩充性上,Matlab 更是远远胜于其它高级编程语言。
Matlab 的功能非常强大,但也不是完美无缺的。
现有的很多大型程序是用C /C ++语言编写的,不可能完全使用Matlab 语言改写。
首要的问题是代码重用问题;其次,Matlab 作为一种以解释方式执行的高级计算机语言,其执行效率是较低的,而在火控解算时需要高效率的执行代码,这样又碰到了执行效率的问题;Matlab 中的变量不需要事先声明就可以直接使用,其调试环境的调试功能也不够强大。
不过,这些问题Matlab 都通过它的外部接口一一解决了。
在火控系统解算中,许多量都可以使用矢量来表示,因此可以使用矢量方程法来进行航空火力控制问题的解算。
利用矢量方程法解算火控问题,简明扼要,推导严密,适用于解算任意复杂的航空火力控制问题。
所以,可以利用Matlab 强大的矢量和矩阵收稿日期:2002-01-23作者简介:周正人(1976-),男,广西兴安人,学士,助理工程师,主要从事火控总体技术研究。
Vol.9 №.4Nov.2002 电光与控制ELECT RONICS OP TICS &CONT ROL 第9卷 第4期2002年11月运算功能,来完成火控解算中的矢量运算或者火控系统的仿真,并且可以用其C++数学库把Matlab 的非脚本m文件转化为C++源文件,然后将其嵌入VC工程中进行编译。
这样可以利用两者长处进行互补,达到事半功倍的效果。
1 Matlab与C/C++的接口及应用1.1 概述Matlab为了解决上述问题,提供了外部接口,本文主要介绍它与C/C++的接口。
为了实现代码重用,Matlab提供了一种Mex文件(在Windows操作系统中为Dll文件)技术,可以在不改变现有代码的情况下,使用尽量少的时间和精力把C代码导入到Matlab中,可以象使用Matlab的内部函数一样使用它,从而解决了如何把现有的C代码在Matlab 中加以利用的问题,即如何把C代码导入到Matlab 中,而且这种Mex文件的执行效率比Matlab中的m文件要高,其详细内容在1.2节中讨论。
作为解决问题的途径之一,利用Matlab提供的工具mcc或其提供的一个插件(Add-in)程序,可以把非脚本m文件翻译成C/C++文件,然后将其嵌入VC工程中编译生成二进制代码,从而大大提高运行速度,而且还可以在VC中进行调试。
在1.3节中将详细叙述Matlab与C++的接口及其应用问题。
当然,Matlab还提供了其它一些技术,如Mat文件、计算引擎等,这些本文不讨论。
1.2 C语言的Mex文件接口及应用首先看一个最简单的例子:#include“mex.h”/*必须包含的头文件*/void Mul(double*x,double*y,double*z){ *z=(*x)*(*y);}/*函数的功能是实现两个数的相乘*/void mexFunction(int nlhs,mxArray*plhs[], int nrhs,const mxArray*prhs[]){ double*x,*y,*z; int row0,col0; int row1,col1; /*检查输入输出变量的个数*/ if(nrhs!=2) (“.”); else if(nlhs>1) mexErrMsgTxt(“too many output arguments.”); /*输入的元素必须为两个非复数的double 类型数据*/ row0=mxGetM(prhs[0]); col0=mxGetN(prhs[0]); if(!mxIsDouble(prhs[0])ûûmxIsComplex (prhs[0])ûû !(row0==1&&col0==1)) mexErrMsgTxt(“inputs must be nocomplex scalar double.”); row1=mxGetM(prhs[1]); col1=mxGetN(prhs[1]); if(!mxIsDouble(prhs[1])ûûmxIsComplex (prhs[1])ûû !(row1==1&&col1==1)) mexErrMsgTxt(“inputs must be nocomplex scalar double.”); /*为返回参数创建矩阵*/ plhs[0]=mxCreateDoubleMatrix(row0, col0,mxREAL); /*为输入输出参数赋值*/ x=mxGetPr(prhs[0]); y=mxGetPr(prhs[1]); z=mxGetPr(plhs[0]); /*调用C函数Mul*/ Mul(x,y,z);}这个例子实现的是两个数的相乘,各个语句的含义请参见注释;以mx,mex开头的函数是Matlab 与C的接口函数,具体用法请参见Matlab的帮助。
该例子的源程序主要由两个不同的部分组成:1)计算子程序。
它包含了所有实际完成计算功能的源代码,用来完成实际的计算工作;2)入口子程序。
它是计算子例行程序同Matlab 环境之间的接口,用来完成两者之间的通信任务。
入口子例行程序的名称为mexFunction,拥有四个参数,分别为prhs、nrhs、plhs和nlhs,其中prhs为一个mxArray结构体类型的指针数组,该数组的数组元素按顺序指向所有的输入参数;nrhs为整数类型,它标明了输入参数的个数;plhs同样为一个结构体类型的指针数组,该数组的数组元41第4期 周正人等: M atlab与C/C++的接口及其在仿真中的应用素按顺序指向所有的输出参数;nlhs 为整数类型,它标明了输出参数的个数。
以上两个步骤是典型的C 语言Mex 文件格式。
其执行流程如图1所示。
为了能够在Matlab 环境下运行这个程序,必须首先配置Mex 的编译环境,其配置工作可在Matlab 环境中运行mex-setup 命令并按提示进行操作。
配置之后,在Matlab 环境下运行mex filename.c 编译C 文件,然后可在当前目录下看到一个与C 文件同名的dll 文件,到此为止已经大功告成。
在Matlab 环境下键入filename (2,3)看看结果,检验一下是否正确。
以上是个非常简单的例子。
在C 语言编程中经常用到结构,下面是一个与数据结构有关的例子。
#include “mex.h ”struct Point { double x; double y ; double z;};void Add(struct Point *p){ p->x ++; p->y ++; p ->z ++;}void mexFunction (int nlhs ,mxArray *plhs [],int nrhs,const mxArray *prhs[]){ const char *fnames[3]; int nfields ,n ,i ; mxArray *tmp; struct Point p1; double *x [3]; if(nrhs !=1) (“.”); else if(nlhs >1) mexErrMsgTxt (“toomanyoutputargument.”); else if(!mxIsStruct(prhs[0])) mexErrMsgTxt (“input must be a structure.”); /*求得输入结构体的域数和每个域的元素个数*/ nfields =mxGetNumberOfFields (prhs [0]); n=mxGetNumberOfElements(prhs[0]); for(i=0;i <nfields;i ++)/*获得各域的域名*/ fnames [i]=mxGetFieldNameByNumber (prhs [0],i ); for(i=0;i <nfields;i ++)/*从输入的结构体中取得数据*/ { tmp =mxGetField (prhs [0],0,fnames [i]); if (mxIsDouble (tmp )!=1) mexErrMsgTxt(“Element is not type of double.”); x [i ]=mxGetPr (tmp ); } 1.=*([0]);42 电光与控制 第9卷 p1.y=*(x[1]); p1.z=*(x[2]); Add(&p1); /*对输出的结构体矩阵进行初始化并赋值*/ plhs[0]=mxCreateStructMatrix(1,1, nfields,fnames); tmp=mxCreateScalarDouble(p1.x); mxSetField(plhs[0],0,fnames[0],tmp); tmp=mxCreateScalarDouble(p1.y); mxSetField(plhs[0],0,fnames[1],tmp); tmp=mxCreateScalarDouble(p1.z); mxSetField(plhs[0],0,fnames[2],tmp);}这个例子同第一个的格式是一样的,区别在于一些mx函数的使用上。