Posted on 2006-12-09 16:32
济公 阅读(2241)
评论(4) 编辑 收藏 引用 所属分类:
VCMatlab
0 引言
MATLAB是MathWorks公司于1982年推出的一套高性能的数值计算和可视化软件。它集数值分析、矩阵运算、信号处理和图形显示于一体,构成了一个方便、界面友好的用户环境。然而MATLAB自身所存在的某些缺点限制了它的应用范围。由于MATLAB是一种解释性语言,因此它的执行效率是比较低的;MATLAB程序不能脱离其环境运行,因此它不能被用于开发商用软件[ 1 ] 。
Visual C++是Microsoft推出的可视化编程环境,它是目前综合性最高、最强大,也是最复杂的软件开发工具之一,应用极为广泛,但VC在工程计算方面要比MATLAB 繁琐得多。若能充分利用VC和MATLAB的各自优势,在VC软件中开发复杂的用户界面、数据采集和管理程序,对于数据的处理则希望通过稳定的MATLAB 程序来实现,这样就可以大大提高软件执行的速度及开发效率和可靠性。
1 MATLAB与C /C++混合编程
一般来说,MATLAB与C /C++混合编程共有三种方式:
①调用MEX文件;
②利用MATLAB引擎函数;
③利用MATLAB C /C++数学库调用MATLAB函数。
其中①②两种方式需依靠MATLAB 环境支持,而方式③可以脱离MATLAB 环境独立执行[ 2 ] 。方式②是用MATLAB作一个计算引擎,允许从自己的C++程序调用这个引擎,在运行时,引擎作为一个进程单独运行, C++程序也作为一个进程单独运行,二者可以通过进程间的通信机制进行交互;在有MATLAB 的环境中, C++可以充分利用MATALB的计算能力和图形句柄能力,达到预期的效果。方式③在脱离MATLAB 环境下能发挥
MATLAB的计算能力,但不能利用MATLAB 的图形句柄能力。但在有些混合编程的场合下,不仅要利用MATLAB的数值计算能力,还要利用其图形句柄能力(即方便的图形输出) 。例如: 在开发数字水印软件中,不仅应用MATLAB 工具箱中的变换函数(DCT、DWT等) 及算法, 还要应用MATLAB方便的图形绘制能力,这靠方式③应用MATLAB C /C++数学库已不能解决问题了。如何解决这个问题呢?曾有人提出将方式②与方式③相结合,这种结合应用程序是不能脱离MATLAB环境运行。随着MATLAB51311 版本发行,在MATLAB C /C ++数学库的基础上,加入了对图形的支持,就使利用MATLAB数学库和图形库开发脱离MATLAB环境
独立运行的程序成为了可能。本文以一个例子说明如何在VC中利用MATLAB 数学库和图形库开发脱离MATLAB环境独立运行的应用程序。
2 利用MATLAB数学库和图形库开发独立运行程序的流程
MATLAB提供了C /C++数学库,其中的C++数学库功能很强,使用它可以用类似MATLAB的语法编写C++程序,十分方便。虽然速度上仍然比手工C /C++程序慢,但是由此换来的高效的开发效率和可靠性往往是值得的。另外mcc命令可以将M文件转化为C或CPP文件,编译后可以脱离MATLAB运行,它们也是使用的C /C++数学库。MATLAB数学库是专门为脱离MATLAB 环境而开发的C /C++程序库,MATLAB图形库可以提供图形界面应用程序的支持。有了MATLAB 数学库和MATLAB图形库,就可以把大部分的. m文件写
成的应用程序编译成可执行的exe 程序, 脱离MATLAB环境独立运行了[ 3 ] ; 当然也可以将. m 文件编译成C+ +程序,添加到VC的工程中,实现VC和MATLAB的混合编程,使应用程序同样可以脱离MATLAB环境独立运行的。图1展示了如何在VC中利用MATLAB数学库和图形库开发独立运行应用程序的步骤。
图1 在VC中利用MALAB开发独立运行的应用程序流程图
3 开发实例
311 编写MATLAB的. m函数文件原函数文件为test. m。该函数实现的功能是生成一个正弦函数的信号,并对一维信号进行余弦变换,得到其变换系数,最后以将信号和变换系数在图形窗口中显示。函数的入口参数n为产生离散正弦函数信号的采样点数。
function test ( n)
if isstr ( n)
n = str2num ( n) ;
end
signal = sin ( [ 1: n ] /n3 (16 3 p i) ) ; %产生一个正弦函数的信号signal
subp lot (211) ;
p lot ( signal) ;
coff_dct = dct ( signal) ; %对信号signal进行DCT变换,得变换系数coff_dct
subp lot (212) ;
p lot ( coff_dct) ;
312 利用mcc编译. m文件在MATLAB利用mcc编译test. m函数文件,产生test1cpp, subplot1cpp, dct1cpp, test1hpp, subplot1hpp,dct1hpp等文件。编译命令为: mcc2B sglcpp test,参数“ - B sglcpp ”含义是将. m文件编译成为C++代码,提供图形库支持, 并编译为独立运行的exe程序。
313 在工程中插入. cpp, . hpp文件利用MFCW izard ( exe)建立一个名为SglMFC的工程。将上面生成的test. cpp, subp lot. cpp, dct.cpp, test. hpp, subp lot. hpp, dct. hpp 文件移到SglMFC工程目录下,并分别插入到该工程中,若产生了其它的. cpp,. hpp也应同理插入到工程中。
314 在工程中进行MATLAB数学库和函数库的初始化设置和关闭
在CmainFrame的构造函数进行Matlab数学库和图形库的初始化设置,在析构函数中进行C++函数库和图形库的关闭设置,在MainFrame. cpp 文件中包含三个头文件。
#include“stdafx. h”
#include“matlab. hpp”
#include“test. hpp” / / test是利用mcc生成的文件
CmainFrame: : CmainFrame ( )
{ libmmfile Initialize ( ) ; / /初始化Matlab数学库
libmwsglm Initialize ( ) ; / /初始化Matlab图形库
mlfHGInitialize (NULL,NULL) ;
}
CmainFrame: : ~CmainFrame ( )
{ mlfHGWaitForFiguresToDie ( ) ;
mlfHGTerminate ( ) ;
libmmfileTerminate ( ) ; / /关闭Matlab数学库
libmwsglmTerminate ( ) ; / /关闭Matlab图形库
}
315 编写调用MATLAB功能函数的程序
在工程中插入一个顶层菜单SHOW,在该菜单下插入一个下拉式菜单项CallMatalb,并指定其ID为ID _SHOW _CALLMATLAB。利用ClassWizard生成该菜单的消息处理函数:
void CmainFrame: :OnShowCallmatlab ( )
{ mwArray n; / /定义mwArray变量n,作为参数
传递给函数test
n = 64;
test ( n) ; / /调用test函数
}
316 在VC中进行编译环境设置
31611 选择菜单Tools 0 Op tions,选择Directories属性页,添加头文件搜索路径和库文件搜索路径,本计算机的头文件搜索路径和库文件搜索路径如下:
F: \matlab62 \ extern \ include
F: \matlab62 \ extern \ include \ cpp
F: \matlab62 \ extern \ lib \win32
F: \matlab62 \ extern \ lib \win32 \microsoft\msvc60
31612 选择菜单Project 0 Settings,打开工程设置对话框, 在C /C + + 属性页中选择Category 为General,在Prep rocessor definitions编辑框添加三个字符串MSVC, IBMPC, MSW IND。
31613 在C /C + + 属性页内, 在Category 为Precomp iled Headers 选择Automatic use ofp recomp iled headers,在Through header编辑框中,输入stdafx. h。
31614 在C /C++属性页内,选择Category为CodeGeneration,在Use run - time library列表框中,选择
DebugMultithreaded DLL。
31615 在Link属性页中,选择Category为Input,在Object/ library modules编辑框,添如如下的7个库文件: libmmfile. lib, libmatlb. lib, libmx. lib, libmat. lib,libmatpm. lib, sgl. lib, libmwsglm. lib。
317 在VC环境中编译、连接、运行。
4 结语
通过上面例子可以看出, 在VC 中利用MATLAB的数学库和函数库可以充分发挥MATLAB的数值计算能力和图形窗口输出能力,有效地提高了软件开发的高效性和可靠性。