VC与MATLAB的最新集成方法及其应用


下面的文章 来自 : 猫扑 wenshiwen的日志  :  http://blog.hi.mop.com/blog/28921869/4368038.html
1 问题的提出
Matlab是 美国MathWork,公司推出的一个为科学和工程计算而专门设计的高级交互式软件包;是一个集科学计算、图像处理、声音处理于一体的高度集成系统。它以矩阵作为基本数据结构,可大大节省编程时间,且Matlab语法规则简单、易于掌握、调试方便。利用Matlab可设计出功能强大、界面优美、性能稳定的高质量程序,因而成为当今国际上最流行的控制系统计算机辅助设计软件。但Matlab程序也存在着诸多不足之处,例如:程序边解释边执行,运算速度较慢;Matlab不适合作为通用的编程平台,即无法脱离Matlab环境运行;其提供的控件和事件的限制,使得GUI功能较差。因此,实现Matlab与VC++,V B,BC,C + + BUILDER等可视化语言的交互,提高速度,美化界面,使程序更符合Windows的规范,有助于发挥Matlab和这些可视化语言的各自优势。
2 Matlab语言与VC++语言集成的几 种 方 法
以 Matlab与VC的混合编程为例介绍几种主要的接口方法。Matlab5 .0 以后版本自带了C语言编辑器(Compiler),可将M文件转化为
CMEXC/C+十程序M,便于实现VC与Matlab的混合编程。
Matlab与 VC集成方式有多种,主要包括:
(1) Matlab程序用C或C++语言编写,然后编译成MEX文件用于Matlab的调用。
在Matlab中可调用的C或Fortran语言程序称为MEX文件 。Matlab提供T专门编写MEX文件的工具,它可以把已做好的C++源程序编译成  .mex 文件供Matlab在命令行方式下调用。Matlab解释器可以自动载入并执行它。具体操作可参考MEX文件的编程规则要求。
(2) 在 V C程序中利用MatlabEngine调用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程序中利用MatlabCMathL 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) 在 Matlab环境下运行“mbuild-setup",按提示选取MSVC;
(3) 在 Matlab环境下运行“cd(prefdir)”和"mccsavepath";
(4) 在 MSVC环境中配置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函数,且自动生成的代码相当繁杂。这些问题还需要研究工作者进一步的努力和探素。



====================================================
下面这个来自 百度分享 :   http://apps.hi.baidu.com/share/detail/5036415
MatlabVC++混合编程的具体方式有多种,根据Matlab是否运行可大致分为两类:Matlab在后台运行和可以脱离Matlab环境运行。Matlab 5.0以后版本均自带C/C++编译器,可将其程序文件(M文件)转换为C-MEXC/C++程序。
 
第一种方式是Matlab引擎采用客户机/服务器的计算方式,通过WindowsActivcX通道和Matlab接口。在具体的应用中,VC的程序作为前端客户机,通过调用Matlab引擎在后台与Matlab服务器建立连接,实现动态通信。这种方法实现较为简单,不要求连接整个Matlab,只需要嵌入必要的Matlab引擎库,可大大地节省系统资源,但这种Matlab在后台运行,运行效率低下。 
 
第二种方式是使用Mathtools公司推出的Matlab集成编译开发平台Mideva,它提供了对M文件的解释执行和开发环境支持。经过简单设置后Mideva可以将M源文件转换为C/C++,然后添加到VC++工程中。 也可以先利用Mideva直接生成EXE文件(方法是启动Mideva,在菜单"File->Compile to exe", 选出需要转换的M文件),然后在VC++中通过shellexec()winexec()等外部函数完成Shell调用。这种方法简单方便,但运行时出现一个控制台窗口,而且由于VCMatlab之间不能交互,通用性差。 
 
第三种方式是通过Mablab编译器将其m文件转换成为C/C++代码文件并生成必要的dll后再通过VC++编译器生成可独立执行的应用程序,这种方式可以直接调用其中的库函数,生成并发布不必依赖Matlab的可执行文件。在建立好函数m文件(不能是脚本m文件)后,用mcc命令将其转换为C++代码,命令行参数如下(假定m文件为test.m):

mcc -t -L Cpp test.m


===================================================================

>> mcc -t -L Cpp run_TLD.m
The -t switch is no longer supported; the Compiler no longer generates C/C++ 
source code for MATLAB functions (it generates wrapper functions instead, see 
the documenation for -W). 


The -L switch is no longer supported; the target (-T) and wrapper (-W) 
switches determine the language of the generated code. 


Error using mcc
Unable to determine application type, since no wrapper function was specified.
Please use the -W switch or specify application type via -m or -l.
Type 'mcc -?' for further assistance

  啊 啊啊 啊  这种方法已经不行了呀。。。。。。。。@timid_smile

=================================================================


  然后继续生成动态链接库函数:

mcc -t -W lib:test2 -T link:lib test.m


 需要注意的是,"lib:"后跟生成的库文件名不能和原m文件名相同(此处为test2),而且此处只能生成C语言方式的动态链接库。该编译命令共生成9个文件,其中test.libtest.dll是可以在C/C++应用程序中调用的动态链接库文件。


 
最后一种方式是通过Matlab Add-in实现MatlabVC的混合编程,这是最方便的也是本文下面将要使用的集成方式。在Matlab 6.0以后版本对其编译器作了较大的改进,其支持更多的数据类型,更强的优化功能,更为重要的是其Matlab Add-in提供了一个MatlabVC直接集成的途径。它具有一些新的特征:快速集成M文件到C++工程中,创建独立的 C/C++应用程序或C MEX DLL;通过M文件创建共享库或MEX文件;内含Visual Matrix Viewer,调试过程中可以查看矩阵变量的值; 直接修改M源文件而不是修改生成的C/C++文件;方便快捷地打包应用程序等。

下面给出Matlab Add-in的具体安装步骤:
1. 1
 启动Matlab,运行"mex-setup",按照菜单提示选取MSVC。它将配置MEX使用VC为默认的编译器(创建C-MEX文件必需),并安装Matlab Add-in所需文件到VC目录。 
1.2. Matlab环境下运行"mbuild-setup", 按提示选取MSVC。它将配置使用VC为默认的编译器(创建独立应用程序必需),并安装Matlab Add-in所需的Matlab CompilerC/C++数学库文件到VC目录。 
1.3. Matlab环境下运行"cd(prefdir)""mccsavepath"。它将保存当前Matlab路径到mccpath文件中,这是因为Matlab Add-in脱离Matlab运行,否则它无从知道Matlab路径。 
1.4.
 启动VC环境,从菜单"Tools -> Customize"选择"Add-ins and Macro Files"选项卡,选中"Matlab Add-in", 点击"Close"VC工具栏出现Matlab Add-in图标,完成Matlab Add-in的配置,以后每次启动VC将自动加载Matlab Add-in
1.5.
 配置Windows系统。如果是Windows 95/98系统,找到config.sys, 添加一行:shell= c:\ command.com /e:32768 /p;如果是Windows ME则需设置Conagent.exe的属性Memory选项卡的Initial Environment值为4096


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值