让心去旅行!

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

上一篇 / 下一篇  2006-09-14 16:49:55 / 天气: 晴朗 / 心情: 高兴

在“浅析VC与Matlab联合编程<一>”和“浅析VC与Matlab联合编程<二>”中介绍了matcom,这个工具可以将用matlab写的m文件翻译成C++文件,或者是可执行文件(exe)或库文件(dll)。但是matcom在很多方面也有限制,比如,对struct等类的支持有缺陷,部分绘图语句无法实现或得不到准确图象,尤其是三维图象。
6t T;L;a\{ T0  实际上VC与matlab的接口实现方法有很多种,matcom只是其中一种,本文再介绍一种比较容易实现的方法:COM接口方法。COM(Compponent Object Model组件对象模型)是一项比较复杂的技术,详细讲的话几本书也讲不完,所以在这里不作介绍,本文通过一个例子详细介绍如何在matlab下做COM组件,以及如何在VC中调用COM组件。EDA中国门户网站g/a1K.Y}Q.u
  首先在Matlab编辑器里编辑m函数文件:启动matlab->File->New->M-file 函数内容如图1:该函数无输入输出参数,文件保存为huatu.m。
y)n"bsOQwy0EDA中国门户网站9it3~v'^
EDA中国门户网站PE lq EMU
图1 m函数huatu.mEDA中国门户网站 {:I9PYe7z:zW

7M(G$d N&T?9B0在matlab下建立COM组件,步骤如下: EDA中国门户网站c Py#~*X+qT\
1、在matlab command window 输入如下命令: EDA中国门户网站LYC"ABQqZe9{,~y _
>> comtool EDA中国门户网站%FU9p)J&Z UH
出现com编辑界面,如图2:
'^"h b&?oI"L0
i[C~4ii0
9np3o)~(Rt-C0图2 com组件编辑界面
9[vJ6}y-e0EDA中国门户网站d*Bw/tV1L{+]]
2、新建工程:File->New Project…,如图3。
H&|,UdZ`j/h0
1Z&~|a(_0图2 com组件属性设置
;_3T_s,us_0EDA中国门户网站4?1[3H&ob X+p tsl_
3、设置组件属性,在"Component name"项中填写组件名称"component",这时候会自动生成类"component",在"Class name"项中填写类名称"huatu",如图4,
{ JZ+_zCK*{N;q0@;_2w0EDA中国门户网站"mX {P0UO
图4 com组件属性设置1EDA中国门户网站,[ dsD-z*V!V/Ek
EDA中国门户网站6T3DB$zYA5_GF
  为了便于区分,选中"Classes"中的"component",点击“remove”按钮,将类component移除,再点击"Add>>"添加新类huatu,结果如图5。点击"OK",接下来出现一个对话框,选择"Yes".
Bcw SoY P0
:_T#O^JLZ0图5 com组件属性设置2EDA中国门户网站A5e+\ a4qL

Zy/e$H _B-U04. 添加文件:选中左边工作区的"huatu",点击Project->Add File…,选择已经编辑好的函数文件huatu.m,如图6。需要注意的是m文件必须是m函数,否则会报错,如果是m脚本文件的话,只需要改为无输入输出参数的m函数即可。
!Zj^#Ws[8z0
.i \ a6sCKK.C0图6 添加m文件
\*F0p*D/[ln0EDA中国门户网站 N!? f9Vq;bA
5、生成 com组件:点击Build->COM Object…,结果如图7。 EDA中国门户网站M&_cG&j

q5\nb2hw0图7
^y x?` o0
P+hra WK0com组件已经由matlab做好,默认的保存位置为:matlab安装位置\work\component。
0X:A eo p,~!@7{7c0EDA中国门户网站QfPe Hd6{}
VC中调用COM组件,步骤如下: EDA中国门户网站4\*Jz;K \#d5F?
1、在VC中建立名为ComHuaTu的基于对话框的MFC(exe)。
GcS2O%w"d02、面板上添加一个名为“画图”的button按钮,如图8。
T8kI.`*|(yO-B0EDA中国门户网站 ZE po;G&blE[
EDA中国门户网站hp.Aw lu^,K
图7 工程界面
0]D:} m o0EDA中国门户网站c(JEq*],J `
3、将component_idl.h 和component_idl_i.c文件拷贝到VC建立的工程ComHuaTu目录下。两文件默认目录为\work\component\src
q+o&Adg04、将上面两文件加入工程:工程->添加工程->Files,选择刚刚拷到目录下的component_idl.h 和component_idl_i.c文件。 EDA中国门户网站 i S0k c"D@%WC
5、将目录/extern/include/下的mwcomtypes.h拷贝到工程ComHuaTu目录下,并加入到工程中,方法同上。
(\ bI:wB}06、为程序添加头文件component_idl.h 、component_idl_i.c和mwcomtypes.h,结果如图9
Rw;m4Y-DMU3IZ0EDA中国门户网站}J1OZw1YT:W
图9 添加头文件EDA中国门户网站%oU}6S&tUUe'`+Z2HbO
EDA中国门户网站Y}l4X(jl+c
EDA中国门户网站w*?#b@} oBk

7、按钮画图函数添加代码:
Y9LjOV&`nFc n2F0
-Udy$Jw2A-nH le!KZ0图10 添加按钮函数代码
Y,U gh7s {"p\ Z!b0EDA中国门户网站W6T1X&uw0M;c+{
函数代码的意义涉及到COM,正在写VC调用COM组件所涉及到的有关COM方面的知识。 EDA中国门户网站FevvT7Pe
8、设置预编译头文件:工程->设置(快捷键Alt+F7),选择C/C++项precomplied Headers,设置如图11
}o-KAs!T Jy`N0EDA中国门户网站DO/iK'?PQ
图11 预编译头文件设置EDA中国门户网站7m B b @5x6W7_
EDA中国门户网站"~Yp&vzJ&V
9、编译、连接、运行,结果如图12。
q-H f-wF#G0EDA中国门户网站w}-z7imt8Zg7y
图11 运行结果
%F8g"v-O lX;MD$s0EDA中国门户网站 ?ki:^0E
  可以看出利用VC调用com组件的方式来调用matlab比较简单,而且几乎支持matlab所有的函数,在m文件较大、用matcom、调用math library或使用mcc方式无法实现的时候,推荐使用。需要说明的是,以上程序拷到另一台机器上是无法直接运行的,因为COM组件没有新机器上注册,如果要在另一台机器上使用的话,还需要打包安装COM组件,并且由于本程序代码很简单,所以也就不提供源程序了,自己可以动手做一下

 

 

在前面的介绍中,只是简介绍了VC与Matlab程序设计的几个简单例子,很多关键性的知识都没有介绍(例如函数的输入输出格式,VC中调用工具箱函数,编译器的使用,几种方法的混合使用等等)在以后的文章中,将会对这些知识进行介绍(因此标题也改了一下,呵呵,如果有错误的地方,还望大家多多指点)VC调用Matlab的方法有多种,为了对混合编程有一个大概认识,将常用的几种方法中介绍一下:
\ h#[}S:r%z0EDA中国门户网站,i(a9\/tC#v2_6^Z
一、通过Matlab Engine方式EDA中国门户网站,V'{/AI5O5s
  Matlab Engine是指一组Matlab提供的接口函数,支持C语言, Matlab Engine采用C/S(客户机/服务器)模式,Matlab作为后台服务器,而C程序作为前台客户机,通过Windows的动态控件与服务器通信,向Matlab Engine传递命令和数据信息,从Matlab Engine接受数据信息。用户可以在前台应用程序中调用这些接口函数,实现对Matlab Engine的控制。采用这种方法几乎能利用Matlab全部功能,但是需要在机器上安装Matlab软件,而且执行效率低,因此在实际应用中不采用这种方法,在软件开发中也不可行,我认为适合个人使用或做演示用,因此不打算介绍。 EDA中国门户网站&N!H@7@0n6W@F
EDA中国门户网站9C9hy2Sib!m{U.m
二、直接调用Matlab的C/C++数学函数库
|*T s4IUuzW$`0  Matlab中提供了可以供C/C++语言调用的C/C++数学函数库,其中包含了大量用C\C++语言重新编写的Matlab数学函数,这些函数涉及到线形代数、数值分析、傅立叶变换、多项式计算、解微分方程等,并且函数库中提供了大量各种矩阵操作函数,在VC中可以直接使用这些函数,通过这些函数可以在VC中方便的实现在Matlab中矩阵运算功能。可以看出用这种方法可以很灵活的调用Matlab来编写应用程序,但要求读者对C\C++语言比较熟悉,可以看出使用这种方法调用Matlab的工具箱函数有很大困难。适合对C\C++语言比较熟悉的用户使用,
/@1CB[p({`0
.`$K z]_4o0Z5b3c0三、用Matlab自带的Matlab CompilerEDA中国门户网站;Lf&Oa4or${
  Matlab Compiler的作用是将m文件转化成C/C++代码(也就是通常所用的mcc命令),这种源代码需要用C/C++编译器编译连接成独立应用程序,在将m文件转成独立应用程序的过程中生成的C/C++文件,原则上是可以被其它的C/C++代码调用的,编译器可以通过设置mcc命令的选项,将m文件编译成动态链接库文件、C/C++文件、可执行文件等一系列文件。到matlab R21.1为止,Matlab Compiler的m程序转换成C/C++代码功能有很多限制:

  1. 不能转换脚本m文件,只能转换m函数;
  2. 不能使用matlab对象;
  3. 不能用input或者eval操作matlab空间变量;
  4. 不能动态地命名变量,然后用load或者save命令来操作;
  5. 不能处理具有嵌套调用其他m文件的m文件;
  6. 不能使用MATLAB内联函数;

四、使用matlab的combuilde工具
_;m1_N8Rc0\@%S0   COM是component object module的简称,它是一种通用的对象接口,任何语言只要按照这种接口标准,就可以实现调用它。matlab6.5新推出来的combuilder就是把用matlab编写的程序做成com组件,供其他语言调用。该方法实现简单,通用性强,而且几乎可以使用Matlab的任何函数(注意:不支持脚本文件,脚本文件使用时要改为函数文件),因此在程序较大、调用工具箱函数或调用函数较多时推荐使用,这也是Matlab公司(Matlab公司就是Mathworks公司)推荐的使用方法。
3zE mY.@0yX0EDA中国门户网站:M9ra9K/p
五、使用matcom工具。
!qZ RK6~\r9G0  这是个第三方控件,很小(8M多),原本属于mathtool公司,后来被Mathworks公司合并了,使用该工具可以将m脚本文件和m函数转化成相同功能的C\C++文件,相比其它方法使用matcom具有如下优点:

  1. 转换过程简单(由matcom工具自动实现),容易实现;
  2. 可以方便的生成动态链接库文件(dll)和可执行文件(exe);
  3. 不仅可以转换独立的脚本文件,也可以转换嵌套脚本文件;
  4. 设置环境后,可以使用Matlab的工具箱函数;

但matcom也有以下不足:

  1. 对struct等类的支持有缺陷,对class数据类型;
  2. 部分绘图语句无法实现或得不到准确图象,尤其是三维图象;

因此在不涉及到三维做图以及m文件不大的情况下推荐使用。
E+h;x*JvoH0
/L%OpDA5m0  以上几种方法可以单独使用,也可以混合使用。这里简单的介绍了VC和matlab接口的几种方法,读者可以根据需要选择适合自己的方法。需要说明的是上以上几种方法并不是相互独立的,而是有相互联系的,比如使用C/C++函数库与使用编译器,对于实现相同功能的程序,直接调用函数库与使用编译器最终生成的代码可能相差不大,只不过一个是直接在VC中写C/C++代码,一个是在Matlab中写好m代码,然后通过编译器将m代码转化成相同功能的C/C++代码,而在转化的过程中也需要调用相应的C/C++函数库文件。


TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2008-10-09  
   1234
567891011
12131415161718
19202122232425
262728293031 

数据统计

  • 访问量: 13442
  • 日志数: 106
  • 图片数: 9
  • 文件数: 4
  • 建立时间: 2006-05-07
  • 更新时间: 2008-06-17

RSS订阅

Open Toolbar