Posted on 2006-12-17 16:50
济公 阅读(2641)
评论(2) 编辑 收藏 引用 所属分类:
VCMatlab
1 问题的提出
Ma tla b是 美国MathWork,公司推出的一个为科学和工程计算而专门设计的高级交互式软件包;是一个集科学计算、图像处理、声音处理于一体的高度集成系统。它以矩阵作为基本数据结构,可大大节省编程时间,且Matlab语法规则简单、易于掌握、调试方便。利用Matlab可设计出功能强大、界面优美、性能稳定的高质量程序,因而成为当今国际上最流行的控制系统计算机辅助设计软件。但Matlab程序也存在着诸多不足之处,例如:程序边解释边执行,运算速度较慢;Matlab不适合作为通用的编程平台,即无法脱离Matlab环境运行;其提供的控件和事件的限制,使得GUI功能较差。因此,实现Matlab与VC++,V B,BC,C + + BUILDER等可视化语言的交互,提高速度,美化界面,使程序更符合Windows的规范,有助于发挥Matlab和这些可视化语言的各自优势。
2 Matlab语言与VC++语言集成的几 种 方 法
以 Ma tla b与VC的混合编程为例介绍几种主要的接口方法。Matlab5 .0 以后版本自带了C语言编辑器(Compiler),可将M文件转化为CMEX或C/C+十程序M,便于实现VC与Matlab的混合编程。
Ma tla b与 VC集成方式有多种,主要包括:
(1) M at lab程序用C或C++语言编写,然后编译成MEX文件用于Matlab的调用。在
Matlab中可调用的C或Fortran语言程序称为MEX文件。Matlab提供T专门编写MEX文件的工具,它可以把已做好的C+十源程序编译成.m ex文件供Matlab在命令行方式下调用。Matlab解释器可以自动载入并执行它。具体操作可参考MEX文件的编程规则要求。
(2) 在 V C程序中利用MatlabE ngine调用Matlab函数。Matlab引攀程序是指通过ActiceX与独立Matlab进程进行通信的C/C十+或者Fortran程序。Matlab提供了一系列的例程使得别的程序可以调用它,从而把Matlab用做一个计算引擎。在运行时,引擎程序和C++程序各自作为一个进程单独运行,二者之间通过进程间的通
信机制进行交互。
(3 )利 用 Mathtools公司推出的Mideva集成编译开发平台,经过简单设置后,可以将M源文件转换为C/C++文件,然后添加到MSVC工程中。或者利用该平台直接生成EXE文件(启动Mideva,在菜单"File-Compiler to exe”中,选出需要转换的M文件),然后在VC中通过外部函数shellexec)或winexec)调用。该方法简单方便,但仅适于VC调用Matlab实现图形显示的情况。
(4 )在 VC程序中利用MatlabC M athL ibrary或Matlab C++Math Library调用Matlab
函数。
3 VC++与Matlab混合编程的最新实 现 方 法
3.1 混合编程步骤
作者 使 用 一种最新、最方便的方法,即通过Matlab6 .0 A dd-in实现VC与Matlab的混合编程,并通过信号处理工具箱(Signal ProcessingToolbox),完成在此环境下的滤波器设计(但须先在VC中加载Matlab Add-in)。具体步骤为:
(1) 启 动 Matlab,运行“mex-setup",按照菜单提示选取MSVC;
(2) 在 M atlab环境下运行“mbuild-setup",按提示选取MSVC;
(3) 在 M atlab环境下运行“cd(prefdir)”和"mccsavepath";
(4) 在 M SVC环境中配置MatlabA dd-in:从菜单“Tools二Customize”的“Add-ins andMacro Files”选项卡中,选择“Matlab Add-in",点击“Close"。此时,工具栏出现Matlab Add-in图标。以后每次启动VC,系统会自动加载Matlab Add-in;在Windows 95/98系统下,找到config.sys文件,添加一行:shell= c,\ C ommand.co m/e,
32768/p,完成系统的配置。
3.2 混合编程的具体实现
以创 建 一 个名为m州lte,的工程为例来具体验证。
第一 步 在 Matlab环境下编辑M文件Cz]myfilter.m 。设计一个通带范围为。一100H z,通带波纹小于3 dB,阻带为一30 dB的最小阶低通滤波器。内容如下(注意:该文件必须是一个M函数,而不能是一个Script文件):
fun ct ion m yf ilt er ()
wp = 10 0/ 50 0, w s=200/500;
[n ,w n] =b ut tor d( wp,ws,3,30);
[b ,a] = bu tte r(n ,w n);
fre gz( b ,a, 51 2, 100 0)
第二 步 : 创建myfilter工程。启动MSVC,打开“File-New",选择Project中的“Matlab ProjectWizard",Pr ojectN ame命名为myfilter,点击Next,应用程序类型选择Windows ConsoleEXE,选定C++程序,其余采用歇认设置,点击"Finish",出现对话框要求选择添加到工程中的M源文件,选中编辑好的myfilter.m 后,这时可看到MSVC调用MCC生成一个混合M文件和C的工程(s7。在“File View',选项卡中可看到添加的M文件和自动生成的M文件及C++文件。
第三 步 : 按F7编译后,按F5运行,运行结果见图1,编译运行后系统自动为程序生成了17个M文件,包括:bilinear.m ,buttap.m ,buttord.m ,datawrap.m ,fr eqchk.m ,fr eqz.m ,fr eqzplot.m ,subplot.m 等。且系统自动生成了各cpp代码,例如可以打开fregzplot.cpp程序代码(有删节):
void fregzplot(mwArray h, mwArray w, mwArray
s _ in0){
Mf re g zp lo t(h ,w , s - in 0) ;
}
voi d ml xFregzplot( intn lhs,m xArray
plhs[], int nrhs, mxArray二prhs仁〕)哎
MW _ B E GI N _ M LX ( );
{
mw A rra y m p rh s[ 3] ;
in t i ;
if ( n lhs > 0) {
err or ( m w A rra y (" R un -ti meE rror:
File:fr egzplotL ine:l C olumn:I T hef unction”
fregzplot" was called with more than the declared
number of outputs (0).”));
)
if ( n rhs > 3) {
err or ( mw A rr ay ( ”R un-time Error:
File: fregzplot Line; 1 Column: I The function"
fregzplot" was called with more than the declared
number of inputs (3)”));
}
for ( i 二 O; i< 3 & 衣 i<nrhs;+ +i){
mp rh s[i ]= m wA rr ay (p rhs 仁i ].0 );
}
for ( ;i < 3; + + i) {
mp rh s[i ]. M a ke DI NO ;
}
Mf req zp lot ( m p rhs [ 0],m prhs[ 1],
mprhs[2]);
)
MW _ E N D _ MLX0;
)
4 结论
利用 M atlabA dd-in实现VC++与Matlab语言的集成具有以下优点:
(1) 集 成 操作简单。即无须添加任何C/C十十代码,即可以生成一个Matlab应用程序(这里需要注意的是,添加到工程的MSVC文件必须是一个函数文件,而不能是一个Script文件,否则会出现错误提示);
(2) 可 以 脱离Matlab环境独立运行。这样集成后的程序能够以独立执行程序的形式运行,只要事先编译好M函数,通过Matlab Add-in与VC的集成调用,完全可以脱离Matlab环境执行程序;
(3) 程 序 的改动直接、方便。若需要改动生成的C++代码,可以在MSVC工作区中直接修改M文件(而不必在Matlab环境中),重新编译即可。作为 一 种 最新的VC++与Matlab的集成方法,Matlab Add-in具有的优越性已经引起人们的普遍关注.当然,目前的Matlab Add-in工具还不完善,比如还不能完全支持所有的Matlab函数,且自动生成的代码相当繁杂。这些问题还需要研究工作者进一步的努力和探素。