浅析VC与matlab接口编程.docx

上传人:b****7 文档编号:11304442 上传时间:2023-02-26 格式:DOCX 页数:57 大小:1.52MB
下载 相关 举报
浅析VC与matlab接口编程.docx_第1页
第1页 / 共57页
浅析VC与matlab接口编程.docx_第2页
第2页 / 共57页
浅析VC与matlab接口编程.docx_第3页
第3页 / 共57页
浅析VC与matlab接口编程.docx_第4页
第4页 / 共57页
浅析VC与matlab接口编程.docx_第5页
第5页 / 共57页
点击查看更多>>
下载资源
资源描述

浅析VC与matlab接口编程.docx

《浅析VC与matlab接口编程.docx》由会员分享,可在线阅读,更多相关《浅析VC与matlab接口编程.docx(57页珍藏版)》请在冰豆网上搜索。

浅析VC与matlab接口编程.docx

浅析VC与matlab接口编程

浅析VC与matlab接口编程

(一)

作者:

孙科

QQ:

44760299邮箱:

c_dinco@

  Matcom是mathTools公司推出的一个能将M文件转化成相同功能C++代码的工具。

相比Matlab自带的编译器Compiler,用Matcom转化代码要简单和方便得多。

本文将结合作者编程经验,以VC6.0和Matcom为例,详细介绍如何利用Matcom进行VC与Matlab的联合编程。

  Matcom安装安装Matcom前要已求安装VC6.0。

在安装过程中出现选择编译器对话框,选择“是”(图一)。

出现选择是否安装Matlab时,选“否”。

其他选项采用默认设置。

Matcom可以独立于Matlab运行,但需要外部的C++编译器,指定Matlab的位置是为了让编译文件中需要的一些系统函数找到路径用的。

图一

安装完成后,启动界面MIDEVA(图二)。

MIDEVA集成开发环境包括命令行窗口、变量列表窗口、命令列表窗口和编译链接信息窗口等几部分,并有详细的帮助文档。

图二

Matcom命令输入方法与Matlab相同。

如果安装在中文版操作系统时,输入命令前加一空格。

(如图三)。

                  图三

下面详细介绍如何将m文件编译后放入VC中。

1、启动MIDEVA,File->New,新建如下Test1.m文件:

x=1:

0.1:

10;y=sin(x);plot(x,y);

将文件保存(如图四)。

    图四

m文件保存的默认位置为:

matcom安装目录\matcom45,生成的C++文件保存的默认位置为:

matcom安装目录\matcom45\Debug\,本例matcom安装目录为C盘即C:

\matcom45\Debug\,在该目录下将会产生Test1.h、Test1.cpp、Test1.r、Test1.obj文件。

2、在VC中用MFCWizard(exe)创建一个基于对话框名为Example的工程。

在面板上添加一个ID为IDC_BUTTON1按扭。

3、将C:

\matcom45\Debug目录下的Test1.cpp文件的内容拷贝到

voidCExamleDlg:

:

OnButton1()下,(如图五)。

            图五

4、将C:

\matcom45\lib\下的matlib.h和v4501v文件和C:

\matcom45\debug下的Test1.h文件拷贝到工程Example目录下,然后在VC中将库文件和头文件加入到工程中:

工程->添加工程->Files,选择刚刚拷贝到Example目录下的matlib.h、v4501v和Test1.h文件(如图六)。

         图六

5、在ExamleDlg.cpp中加入如下代码:

#include"matlib.h"

#include"Test1.h"

6、在voidCExamleDlg:

:

OnButton1()中分别添加一个初始化类库调用函数”initM(MATCOM_VERSION)”和一个结束类库调用函数”exitM()”(如图七)。

            图七

运行程序,点击画图按扭(如图八)。

 

                            图八

  程序的release版本需要ago4501.dll、v4501v.dll、v4501.lib三个文件的支持。

以上只是介绍了VC和Matcom接口编程的一个简单例子,功能并不完善,也远远达不到一个软件所要求的水平,但只要熟悉了VC和Matcom接口编程的基本原理和方法,相信大家一定能够编出优秀的软件。

浅析VC与Matlab联合编程

(二)

  在“浅析VC与Matlab联合编程

(一)”中简单介绍了VC与matcom的接口编程,实现了VC调用matcom的一个基本功能,要真正熟练使用接口编程,还要对函数调用有一定了解。

本文通过一个实例,较详细的介绍如何在VC中调用matcom编译后的函数。

  首先新建一个函数huatu.m,该函数的功能是:

接受用户输入的左端点值和右端点值两个输入参数,然后在该区间画正弦图形。

函数还将生成两个随机数,作为一个点的坐标在图中打印出来(绿点),用来说明如何在VC中处理调用函数的返回值。

步骤如下:

1.建立一个名为Example2基于对话框的MFC(exe)工程。

2.在matcom中新建一个名为huatu.m文件,如图1;

图1

3.在matcom命令窗口中运行该函数,如图2;

图2

4.将生成的huatu.h、huatu.cpp(默认位置为安装目录:

\matcom45\samples\Debug)和matlib.h、v4501v.lib(默认位置为安装目录:

\matcom45\lib)四个文件拷贝到建立的工程Example2目录下。

5.将第四步拷贝的四个文件加入到VC工程中:

工程->添加工程->文件,选择刚才拷贝到Example2目录下的四个文件。

完成后如图3;

图3

6.在Example2dlg.cpp中添加头文件:

(如图4所示)

#include"matlib.h"

#include"huatu.h"

图4

7.为工程建立界面:

添加一个Button按扭控件;添加四个Editbox控件,用于显示数据;添加五个Statictext控件,四个显示文字,一个显示图形,将显示图形的Statictext的ID设置为ID_PIC。

其他所有控件属性保持默认(为了看图方便,可以适当调整显示图形Statictext控件的边缘)。

如图5所示

图5

8.按Ctrl+W为控件添加变量。

如图6所示

图6

9.为Button1按钮添加响应代码。

如图7所示

图7

10.运行程序,输入左端点和右端点,点击”画图”按钮,结果如图8所示。

(本例只是为了说明如何调用函数,没有进行容错处理)

图8

注:

如果在编译中出现下列错误:

fatalerrorC1010:

unexpectedendoffilewhilelookingforprecompiledheaderdirective

  进行下列设置:

工程->设置->C/C++选择precompiledheaders选择第一或第二项:

自动选择预补偿页眉,如图9所示

图9

  本例介绍了在VC中如何调用用matcom编译的m函数的方法,并且基本上实现了VC和Matlab的无缝结合,希望对大家编程会有所帮助,现在时间很紧,下次有机会详细介绍m文件翻译成C++语言后代码的含义。

我的QQ:

44760299欢迎大家一起讨论!

浅析VC与Matlab联合编程<三>

  在“浅析VC与Matlab联合编程<一>”和“浅析VC与Matlab联合编程<二>”中介绍了matcom,这个工具可以将用matlab写的m文件翻译成C++文件,或者是可执行文件(exe)或库文件(dll)。

但是matcom在很多方面也有限制,比如,对struct等类的支持有缺陷,部分绘图语句无法实现或得不到准确图象,尤其是三维图象。

  实际上VC与matlab的接口实现方法有很多种,matcom只是其中一种,本文再介绍一种比较容易实现的方法:

COM接口方法。

COM(CompponentObjectModel组件对象模型)是一项比较复杂的技术,详细讲的话几本书也讲不完,所以在这里不作介绍,本文通过一个例子详细介绍如何在matlab下做COM组件,以及如何在VC中调用COM组件。

  首先在Matlab编辑器里编辑m函数文件:

启动matlab->File->New->M-file函数内容如图1:

该函数无输入输出参数,文件保存为huatu.m。

图1m函数huatu.m

在matlab下建立COM组件,步骤如下:

1、在matlabcommandwindow输入如下命令:

>>comtool

出现com编辑界面,如图2:

图2com组件编辑界面

2、新建工程:

File->NewProject…,如图3。

图3com组件属性设置图4com组件属性设置1

3、设置组件属性,在"Componentname"项中填写组件名称"component",这时候会自动生成类"component",在"Classname"项中填写类名称"huatu",如图4

  为了便于区分,选中"Classes"中的"component",点击“remove”按钮,将类component移除,再点击"Add>>"添加新类huatu,结果如图5。

点击"OK",接下来出现一个对话框,选择"Yes".

图5com组件属性设置2

4.添加文件:

选中左边工作区的"huatu",点击Project->AddFile…,选择已经编辑好的函数文件huatu.m,如图6。

需要注意的是m文件必须是m函数,否则会报错,如果是m脚本文件的话,只需要改为无输入输出参数的m函数即可。

图6添加m文件

5、生成com组件:

点击Build->COMObject…,结果如图7。

图7

com组件已经由matlab做好,默认的保存位置为:

matlab安装位置\work\component。

VC中调用COM组件,步骤如下:

1、在VC中建立名为ComHuaTu的基于对话框的MFC(exe)。

2、面板上添加一个名为“画图”的button按钮,如图8。

图7工程界面

3、将component_idl.h和component_idl_i.c文件拷贝到VC建立的工程ComHuaTu目录下。

两文件默认目录为\work\component\src

4、将上面两文件加入工程:

工程->添加工程->Files,选择刚刚拷到目录下的component_idl.h和component_idl_i.c文件。

5、将目录/extern/include/下的mwcomtypes.h拷贝到工程ComHuaTu目录下,并加入到工程中,方法同上。

6、为程序添加头文件component_idl.h、component_idl_i.c和mwcomtypes.h,结果如图9

图9添加头文件

7、按钮画图函数添加代码:

图10添加按钮函数代码

函数代码的意义涉及到COM,正在写VC调用COM组件所涉及到的有关COM方面的知识。

8、设置预编译头文件:

工程->设置(快捷键Alt+F7),选择C/C++项precompliedHeaders,设置如图11

图11预编译头文件设置

9、编译、连接、运行,结果如图12。

图11运行结果

  可以看出利用VC调用com组件的方式来调用matlab比较简单,而且几乎支持matlab所有的函数,在m文件较大、用matcom、调用mathlibrary或使用mcc方式无法实现的时候,推荐使用。

需要说明的是,以上程序拷到另一台机器上是无法直接运行的,因为COM组件没有新机器上注册,如果要在另一台机器上使用的话,还需要打包安装COM组件,并且由于本程序代码很简单,所以也就不提供源程序了,自己可以动手做一下。

  本人正在写一本关于VC和matlab接口方面的书,估计年底完稿,详细介绍VC和matlab接口的几种方法,并提供详细的例子,例子都是我自己写过的,欢迎大家提供些好的意见和建议。

浅析VC与MATLAB联合编程<四>

在浅析VC与MATLAB联合编程<一>、浅析VC与MATLAB联合编程<二>和浅析VC与MATLAB联合编程<三>中简单介绍了VC和MATLAB接口的两种方法,初学者可能会问为什么要用VC和MATLAB接口,接口的实质又是什么,本文就通过一个例子来回答这两个问题。

  首先来介绍一下MATLAB。

MATLAB名字由MATrix和LABoratory两词的前三个字母组合而成。

那是20世纪七十年代后期的事:

时任美国新墨西哥大学计算机科学系主任的CleveMoler教授出于减轻学生编程负担的动机,为学生设计了一组调用LINPACK和EISPACK库程序的“通俗易用”的接口,此即用FORTRAN编写的萌芽状态的MATLAB。

  经几年的校际流传,在Little的推动下,由Little、Moler、SteveBangert合作,于1984年成立了MathWorks公司,并把MATLAB正式推向市场。

从这时起,MATLAB的内核采用C语言编写,而且除原有的数值计算能力外,还新增了数据图视功能。

  MATLAB以商品形式出现后,仅短短几年,就以其良好的开放性和运行的可靠性,使原先控制领域里的封闭式软件包(如英国的UMIST,瑞典的LUND和SIMNON,德国的KEDDC)纷纷淘汰,而改以MATLAB为平台加以重建。

在时间进入20世纪九十年代的时候,MATLAB已经成为国际控制界公认的标准计算软件。

MATLAB已经成为目前国际上最流行、应用最广泛的科学工程计算软件,它广泛的应用于自动控制、数学运算、信号分析、图象处理、财务分析等各行各业。

由于它具有强大的计算和绘图功能、大量稳定可靠的算法库和简洁高效的编程语言,已成为数学计算工具方面事实上的标准。

  在欧美大学里,诸如应用代数、数理统计、自动控制、数字信号处理、模拟与数字通信、时间序列分析、动态系统仿真等课程的教科书都把MATLAB作为内容。

这几乎成了九十年代教科书与旧版书籍的区别性标志。

在那里,MATLAB是攻读学位的大学生、硕士生、博士生必须掌握的基本工具。

  在国际学术界,MATLAB已经被确认为准确、可靠的科学计算标准软件。

在许多国际一流学术刊物上(尤其是信息科学刊物)都可以看到MATLAB的应用。

在设计研究单位和工业部门,MATLAB被认作进行高效研究、开发的首选软件工具。

如美国NationalInstruments公司信号测量、分析软件LabVIEW,Cadence公司信号和通信分析设计软件SPW等,或者直接建筑在MATLAB之上,或者以MATLAB为主要支撑。

又如HP公司的VXI硬件,TM公司的DSP,Gage公司的各种硬卡、仪器等都接受MATLAB的支持。

为了说明问题,我们举个例子:

解下列线形方程组:

(如图1):

 

图1

用C语言(VC环境中)编写的代码为:

(图2)

图2

编译、连接,运行结果为:

(图3):

图3

而该方程在MATLAB中只需要一个命令“\”就可以解决:

在MATLAB中建立一个新的m文件,在MATLAB菜单中:

File->New->Mfile(如图4):

图4

在M文件中输入代码,并保存为QJFCZ.m。

(如图5)

图5

在MATLABCommand命令窗口中输入以下命令:

>>QJFCZ

然后回车,结果如下:

x=

-0.1429

2.7857

0

>>

  可以看出用MATLAB写出的代码十分简单,对于上面的方程,如果矩阵A和b的维数发生变化的话,C代码还要重新编写,而用MATLAB书写的代码几乎不用改动,只需改变数据即可。

  如果现在我们用VC编写的一个软件,其中要求解有5个未知数的线形方程组,如果用C\C++语言来写程序的话其编程量是很大的,如果在C\C++语言中能用MATLAB那么简单的代码来实现该功能就可以大大减少工作量,VC和MATLAB接口就是做这个工作的。

MATLAB中提供了大量用C\C++重新编写的MATLAB库函数,包括初等数学函数、线形代数函数、矩阵操作函数、数值计算函数、特殊数学函数、插值函数等等,还可以利用MATLAB的编译工具将m文件方便的转化为C\C++语言、可执行程序(exe)、动态连接库文件(dll)、COM组件等等,并可直接供C\C++语言调用,利用VC和MATLAB接口技术可以在VC中充分发挥MATLAB的数值计算功能,并且可以不依赖MATLAB软件运行,我们在编写程序时,可以在VC下做出很漂亮的界面,而把复杂的数值处理交给MATLAB去做(实际上MATLAB也能做界面GUI(GraphicUserInterface),而且做出的界面我认为并不比VC逊色,但是需要MATLAB软件作为后台运行,如果不依赖MATLAB软件运行的话,可以在VC中调用GUI),然后通过接口技术将MATLAB集成到VC中,这样可以大大减轻编程的负担,并减少程序编写时间。

  事实上正是由于MATLAB数值计算功能的强大,MATLAB与许多程序都有接口,例如Fortran、VB、Java、SPSS(一个著名的统计软件)、Excel、Word等,其实质也是通过接口在程序中调用MATLAB的功能。

精通VC与Matlab联合编程(五)

  在前面的介绍中,只是简介绍了VC与Matlab程序设计的几个简单例子,很多关键性的知识都没有介绍(例如函数的输入输出格式,VC中调用工具箱函数,编译器的使用,几种方法的混合使用等等)在以后的文章中,将会对这些知识进行介绍(因此标题也改了一下,呵呵,如果有错误的地方,还望大家多多指点)VC调用Matlab的方法有多种,为了对混合编程有一个大概认识,将常用的几种方法中介绍一下:

一、通过MatlabEngine方式

  MatlabEngine是指一组Matlab提供的接口函数,支持C语言,MatlabEngine采用C/S(客户机/服务器)模式,Matlab作为后台服务器,而C程序作为前台客户机,通过Windows的动态控件与服务器通信,向MatlabEngine传递命令和数据信息,从MatlabEngine接受数据信息。

用户可以在前台应用程序中调用这些接口函数,实现对MatlabEngine的控制。

采用这种方法几乎能利用Matlab全部功能,但是需要在机器上安装Matlab软件,而且执行效率低,因此在实际应用中不采用这种方法,在软件开发中也不可行,我认为适合个人使用或做演示用,因此不打算介绍。

二、直接调用Matlab的C/C++数学函数库

  Matlab中提供了可以供C/C++语言调用的C/C++数学函数库,其中包含了大量用C\C++语言重新编写的Matlab数学函数,这些函数涉及到线形代数、数值分析、傅立叶变换、多项式计算、解微分方程等,并且函数库中提供了大量各种矩阵操作函数,在VC中可以直接使用这些函数,通过这些函数可以在VC中方便的实现在Matlab中矩阵运算功能。

可以看出用这种方法可以很灵活的调用Matlab来编写应用程序,但要求读者对C\C++语言比较熟悉,可以看出使用这种方法调用Matlab的工具箱函数有很大困难。

适合对C\C++语言比较熟悉的用户使用,

三、用Matlab自带的MatlabCompiler

  MatlabCompiler的作用是将m文件转化成C/C++代码(也就是通常所用的mcc命令),这种源代码需要用C/C++编译器编译连接成独立应用程序,在将m文件转成独立应用程序的过程中生成的C/C++文件,原则上是可以被其它的C/C++代码调用的,编译器可以通过设置mcc命令的选项,将m文件编译成动态链接库文件、C/C++文件、可执行文件等一系列文件。

到matlabR21.1为止,MatlabCompiler的m程序转换成C/C++代码功能有很多限制:

1.不能转换脚本m文件,只能转换m函数;

2.不能使用matlab对象;

3.不能用input或者eval操作matlab空间变量;

4.不能动态地命名变量,然后用load或者save命令来操作;

5.不能处理具有嵌套调用其他m文件的m文件;

6.不能使用MATLAB内联函数;

四、使用matlab的combuilde工具

  COM是componentobjectmodule的简称,它是一种通用的对象接口,任何语言只要按照这种接口标准,就可以实现调用它。

matlab6.5新推出来的combuilder就是把用matlab编写的程序做成com组件,供其他语言调用。

该方法实现简单,通用性强,而且几乎可以使用Matlab的任何函数(注意:

不支持脚本文件,脚本文件使用时要改为函数文件),因此在程序较大、调用工具箱函数或调用函数较多时推荐使用,这也是Matlab公司(Matlab公司就是Mathworks公司)推荐的使用方法。

五、使用matcom工具。

  这是个第三方控件,很小(8M多),原本属于mathtool公司,后来被Mathworks公司合并了,使用该工具可以将m脚本文件和m函数转化成相同功能的C\C++文件,相比其它方法使用matcom具有如下优点:

1.转换过程简单(由matcom工具自动实现),容易实现;

2.可以方便的生成动态链接库文件(dll)和可执行文件(exe);

3.不仅可以转换独立的脚本文件,也可以转换嵌套脚本文件;

4.设置环境后,可以使用Matlab的工具箱函数;

但matcom也有以下不足:

1.对struct等类的支持有缺陷,对class数据类型;

2.部分绘图语句无法实现或得不到准确图象,尤其是三维图象;

因此在不涉及到三维做图以及m文件不大的情况下推荐使用。

  以上几种方法可以单独使用,也可以混合使用。

这里简单的介绍了VC和matlab接口的几种方法,读者可以根据需要选择适合自己的方法。

需要说明的是上以上几种方法并不是相互独立的,而是有相互联系的,比如使用C/C++函数库与使用编译器,对于实现相同功能的程序,直接调用函数库与使用编译器最终生成的代码可能相差不大,只不过一个是直接在VC中写C/C++代码,一个是在Matlab中写好m代码,然后通过编译器将m代码转化成相同功能的C/C++代码,而在转化的过程中也需要调用相应的C/C++函数库文件。

在后面的文章中将从第二种方法开始进行介绍

精通VC与Matlab联合编程(六)

  MatlabC\C++函数库是Matlab扩展功能重要的组成部分,包含了大量的用C\C++语言重新编写的Matlab函数,主要包括初等数学函数、线形代数函数、矩阵操作函数、数值计算函数、特殊数学函数、多项式函数、插值函数等,用户可以在自己的C\C++程序中调用这些函数,实现复杂的矩阵计算功能,从而减少程序设计工作量,需要说明的是C函数库和C++函数库是两个不同的函数库。

在使用前需要进行安装:

在Matlab命令窗口中输入:

mbuild-setup

按照提示选择VC的编译器,完成后在Matlab命令窗口中输入:

mex-setup

同样选择VC的编译器,就完成编译器的安装和配置。

首先介绍下C函数库,C数学函数库所需要的库函数在该目录下:

Matlab根目录:

\extern\lib

下面来看matlab自带的一个使用C函数库的例子(所有使用c函数例子在:

matlab根目录\extern\examples\cmath):

*ex1.c

*

*Copyright(c)1995

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 历史学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1