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引擎,这样可以很好的实现资源的共享和作业的分工合作。
文章编号: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函数的使用上。