2008年9月23日星期二

VC和Matlab调用问题初步研究

众所周知,Visual C++ 6.0是由Microsoft公司推出的可视化集成开发环境。它把面向对象的程序设计方法与可视化的软件开发环境完美地结合,成为众多程序员的首选。Matlab是功能非常强大的数学软件,它广泛应用于线性代数、自动控制理论、数理统计、数字信号处理、时间序列分析、动态系统仿真等领域。然而,Matlab存在不可避免的缺点,一是运算速度较慢,尤其是有多重循环存在的时候更是明显;二是无法脱离Matlab环境运行,可移植性差。因此,如果能够把Matlab的程序加入到自己的Visual C++编制的程序中,将会大大减少编程的工作量、保证程序的准确性,与此同时,能够继承Visual C++良好的用户界面。下面对在Visual C++中调用Matlab程序的几种方法做简要的介绍和比较。
9 V8 S6 L, b8 \9 j, O& x9 h在Matlab与C的接口方面,目前比较常用的方法主要有以下几种:& G' h0 }$ X5 m- W7 R" _' U
1. 在C或C++程序中利用Matlab引擎(Matlab Engine)来调用Matlab的函数。9 B8 V8 d1 f1 u9 ]& {" D8 }
2. 使用Matlab的C++ Compiler(MCC),将M文件编译成CPP源代码,然后在C++编译器中调用。- u! @7 V- v' p6 g, U) B+ }
3. 利用Matlab自带的-mex命令,把Matlab程序编译成MEX文件,然后再用C++来调用。
. `4 C! j# H4 y' x1 c- N/ ?4. 在C或C++程序中使用Matlab提供的C/C++数学库(C/C++ Math Library)直接调用Matlab函数。' i6 B( C0 N# N9 g) } N
5. 用Mideva把M文件编译成CPP源代码,同时编译成EXE文件或DLL文件,生成的CPP源代码可以被C++编译器调用。( q" C/ L& d; D7 f
6. 按照Mideva的语法,在Visual C++中直接书写Matlab语句,实现Matlab和C的混合编程。
: S8 a& z9 |* Y x3 {# ?以上几种混合编程的方法各有利弊。方法1,2,3生成的程序仍然无法脱离Matlab环境,必须在已经安装了Matlab的系统上运行;而方法4,5,6生成的程序则可以独立于Matlab运行。同时,方法1,2,3,4对Matlab中大量的图形句柄函数支持不够,而方法5,6则支持绝大多数的Matlab语句(包括图形)。因此,本文的研究工作主要是采用后两种方法,实现Visual C++和Matlab的混合编程。* L) `; C. z! E' O8 Z4 ~7 B
; K/ a( @$ _ z; R
3.4.1 Mideva简介; a2 X1 r, w7 V, {+ I% N$ j; X: @
Mideva 4.5是MathTools公司在Matcom技术的基础上开发的一个功能强大的工具软件(可以在www.mathtools.com处下载得到30天的试用版)。MathTools公司开发这款软件的出发点就是为Matlab程序的编辑、调试、编译和优化提供一个完整而强大的集成开发环境。它的功能非常强大,提供了Matlab的近千个基本功能函数。Mideva最吸引人的一点就是可以通过Visual C++把Matlab的源代码编译成动态链接库(DLL)或是可执行文件(EXE),甚至可以直接转化成同等功能的CPP源代码。如果使用了Mideva提供的一些库文件,还可以直接实现和Visual C++的混合编程。这样既能够保持Matlab的优良算法,同时也利用了C++的高效率。也就是说,我们可以在Visual C++编译环境下创建友好的用户界面,而把一些较为底层的工作,如数据处理、仿真等交给Matlab来完成。 a/ k% s3 \6 O" Q8 E# @' z6 r$ V6 R
下图为Mideva 的界面:# L: l3 j/ O/ E7 v& a

, l+ L6 t; E! _! m 5 | Z2 p; P' o, Q' j) a5 K

. t% W8 E4 a- E5 x+ r4 }; P' J3.4.2 将M文件转化成CPP文件的方法6 ~/ S% n% A. ~
从以上的讨论可以看出,实现Visual C++和Matlab混合编程的关键就在于把M文件转化成CPP文件,以便在Visual C++里调用。下面就介绍两种把M文件转化成CPP文件的方法。+ |9 Y9 U7 p* s: O
3.4.2.1 在Mideva环境下将M文件转化成CPP文件的方法
/ t5 j p0 L) l4 t; W) B' X0 u在Mideva环境下将M文件转化成CPP文件的方法比较简便易行。首先,在第一次运行Mideva时,要指定所用的C编译器的路径,否则将无法编译。指定好的编译信息会写在Matcom\bin\matcom.ini文件中。在安装Matcom时,它会自动寻找编译器并将其信息写入matcom.ini文件。" N7 j& `& ~( ^9 {: L- ?, m
具体转化时,先在Mideva的Configuration菜单中选择编译方式是Debug模式(调试版)还是Release模式(发行版)(如图3-7所示),这两种模式和Visual C++中的编译版本是相对应的。7 K# Z7 x% j8 H: X8 z

5 V) w/ J. |5 R) C; B随后,选择菜单File下的Run,在弹出的对话框中选择需要转换的M文件,Mideva便会自动运行该M文件并将其转换成相应的CPP文件,运行完之后便可以在相应的Debug或是Release目录下找到和M文件同名的CPP文件。* Z9 A) l6 O/ S9 z3 e6 n
* E: U0 U/ H6 Z0 _
在Visual C++环境下将M文件转化成CPP文件的方法
! N2 Q: L7 B, ` g* A由于Visual C++环境是我们都比较熟悉的可视化集成开发环境,因此这里重点介绍如何在Visual C++环境下将M文件转化成CPP文件的方法。1 p/ {8 w9 O/ c; i5 q7 v: d
要实现这一过程,就必须用到Mideva中带有的Visual Matcom。具体步骤如下。
7 m/ N# F' _" U! y$ q第一步:在Visual C++中安装Visual Matcom。/ v$ p2 n/ Z9 g/ R
启动Visual C++,从主菜单中选择Tools/Customize选项,在弹出的对话框中选择Add-ins and Macro Files标签项,单击Browse…按钮,然后选择“文件类型”为“Add-ins(.dll)”,在C:\Matcom45\bin目录下找到mvcide.dll,单击打开,这样就会出现带有四个按钮的工具条,Visual Matcom便安装完毕。这个过程的示意图如下。" u3 c) {: n# V% R
# t) |2 N" n- n5 b4 ^$ Q
# ]2 r: I+ t. ]$ |# U2 g2 k
第二步,在Visual C++中使用Visual Matcom将M文件转化成CPP文件。
3 R9 d4 r4 a0 e- ^在Visual C++中新建一个工程,单击Visual Matcom工具条中的.m++(Add m-files to current project)按钮,在弹出的对话框中选择需要转换的M文件,则这个文件就会被加入到我们新建的工程中,同时会生成由该M文件转换得到的相同功能的CPP文件,这样,我们就可以像使用工程中的其他CPP文件一样,使用新的CPP文件中定义的函数。
8 f% c+ @' x: `# w

没有评论: