⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 c++builder与matlab混合编程 .htm

📁 VC与Matlab混合编程文章.
💻 HTM
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0044)http://www2.ccw.com.cn/2000/0014/0014b15.asp -->
<HTML><HEAD><TITLE>计算机世界: C++Builder与Matlab混合编程</TITLE><LINK href="/style.css" 
rel=stylesheet type=text/css>
<META content="text/html; charset=gb2312" http-equiv=Content-Type>
<META content="MSHTML 5.00.3315.2870" name=GENERATOR></HEAD>
<BODY bgColor=#ffffff>
<CENTER>
<TABLE cellPadding=0 cellSpacing=0 width=463>
  <TBODY>
  <TR>
    <TD vAlign=top><BR>
      <P align=right><FONT color=#ff0000><B>2000年4月17日</B></FONT> <BR>
      <CENTER><IMG src="C++Builder与Matlab混合编程 .files/c&amp;l8.gif"></CENTER>
      <P></P>
      <CENTER><FONT color=#0000c0>
      <H2>C++Builder与Matlab混合编程  </H2></FONT>
      <H3>长沙张云洲(xingsha@263.net) </H3>
      <HR>
      </CENTER>
      <P><FONT color=#ffffff>----</FONT> 
      在C++Builder中调用Matlab工具箱函数,有两种实现方式。一种是基于Matlab环境支持,通过必要的设置实现,笔者在本刊上曾撰文对这种方式进行了专门的阐述。另一种则是完全脱离Matlab环境,通过动态连接库方式实现对Matlab工具箱函数的调用,这可以通过一种开发平台Mediva来实现。相对来说,前者的限制因素较多,而后者则较为方便灵活。 

      <H3>一、 Mediva软件平台 </H3><FONT 
      color=#ffffff>----</FONT>Mediva是Mathtools公司推出的一种Matlab编译开发软件平台,提供对Matlab程序文件(M文件)的解释执行和开发环境支持。该软件有为Borland 
      C++、Visual 
      Basic和Dephi等编程语言开发的不同版本,目前其版本已经到了4.5版,软件大小仅6.5M,可以通过访问其站点www.mathtools.com免费下载试用一个月。 

      <P><FONT color=#ffffff>----</FONT>Mediva软件平台本身的功能相当强大,提供近千个 
      Matlab的基本功能函数,通过必要的设置,就可以直接实现与C++的混合编程,而不必再依赖Matlab;同时,Mediva还提供编译转换功能,能够将Matlab函数或编写的Matlab 
      程序转换为C++形式的DLL,从而实现脱离Matlab环境对Matlab函数和过程的有效调用,这样就有可能实现对Matlab强大的工具箱函数的利用。 

      <P><FONT 
      color=#ffffff>----</FONT>Mediva的缺点是C++与Matlab混合编写的应用软件必须携带必要的DLL,从而增大了软件的体积(约4M),同时也不能对所有的Matlab 
      函数提供支持,例如采用类库进行设计的部分函数。但尽管如此,对于控制系统计算机设计、分析的工作来说,Mediva仍不失为一个好的工具。 
      <H3>二、 C++Builder直接调用Matlab函数 </H3><FONT 
      color=#ffffff>----</FONT>本文假设已经安装了Mediva软件或已经得到必要的两个动态连接库mdv4300.dll和ago4300.dll。 

      <P><FONT 
      color=#ffffff>----</FONT>Mediva提供的近千个Matlab基本功能函数,都可以在C++Builder中直接调用。这些函数包括基本的操作、命令、I/O、线性代数、位图、控制等,基本上可以满足我们的一般需要。当然其最大的优点就是可以直接在C++ 
      Buider中直接调用而不必考虑安装庞大的Matlab。 
      <P><FONT color=#ffffff>----</FONT>其实现方式和步骤如下: 
      <P><FONT color=#ffffff>----</FONT>1. Lib文件的生成 
      在Dos下用C++Builder中的Implib.exe,通过如下命令生成mdv4300.lib: 
      <P><FONT color=#ffffff>----</FONT>implib mdv4300.lib mdv4300.dll 
      <P><FONT color=#ffffff>----</FONT>将上述两个DLL文件和此Lib文件拷贝到当前目录下。 
      <P><FONT color=#ffffff>----</FONT>2.实现与Matlab的混合编程 
      <P><FONT 
      color=#ffffff>----</FONT>Matlab.h包含了Mediva中所有类型、常量、函数的说明和定义,必须将此头文件放于程序的第一行。Mediva给出的Matlab函数形式并不特殊,如绘线函数Plot,在Mediva中说明为:Mm 
      DLLI plot(cMm varargin);varargin与Matlab 
      中的意义是一样的,与输入变量的个数相对应。所有可以直接使用的函数都在Matlib.h头文件中定义,而在mdv4300.dll中实现。 
      <P><FONT 
      color=#ffffff>----</FONT>但在C++Builder中使用Mediva提供的Matlab函数的格式,与Matlab编程稍有不同,这主要体现在C++中必须进行必要的说明上。例如我们要用绘线函数Plot来绘制数组x[100]的红色图线。在Matlab中调用为Plot(x,‘r');在 
      C++中调用则为:Plot(CL(x),TM(“r")),其中CL是一个关键字,是多变量输入时所必须使用的,用以指明调用的变量;而TM则指明,这是一个字符。 

      <P><FONT color=#ffffff>----</FONT>下面我们给出一个示例程序,其功能是对一个1024 
      点的输入数组进行FFT变换,并绘制变换后频谱实部的火柴杆图,最后将原数据和变换后的数据写入数据文件中。 <PRE>   #include“matlib.h"      //必须包含的头文件
   #include <VCL.H>
   #pragma hdrstop

   #include“TryMatcomU.h"
   #pragma package(smart_init)
   #pragma resource“*.dfm"
    TForm1*Form1;
    __fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
    {
    }
    void __fastcall TForm1::Button1Click(TObject*Sender)
    {
    int k=0;  
    initM(MATCOM_VERSION);         //必须
进行的初始化
    Mm cur1,cur2;              //定义变量
    cur1=zeros(128);  cur2=zeros(128);  //变量初始化

    for  (k=1;k&lt;=128;k++)   
    cur1.r(k)=randM();         //生成一个随机数列
    figure(1);
    plot(cur1);             //图形显示该数列
    
    cur2=fft(cur1,128);   //做128点fft变换
    figure(2);
    //绘制fft变换后实部的火柴杆图,注意此处多变量输入的格式
    stem((CL(cur1),real(cur2),TM(“r")));    
        
    fid=fopen(filename,mode,format) opens 
    exitM();                   //退出调用
    }
</PRE>
      <P><FONT 
      color=#ffffff>----</FONT>如果完全使用C++来实现本程序的工作,其代码将超过300行!由此可以看出,C++Builder与Matlab函数的混合编程可以给我们带来多么大的方便! 

      <P><FONT color=#ffffff>----</FONT>3.变量内部状态/数据的观察方法 
      <P><FONT color=#ffffff>----</FONT> Mediva使用的所有变量均定义为Mm类型。如果在C 
      ++Builder中观察Mm类型变量的内部状态/数据,要稍麻烦一些,但在调试程序时,这又是不可避免的一步,这里举例给出变量观察的方法。 
      <P><FONT color=#ffffff>----</FONT>例如对上面生成的cur2数列进行观察: <PRE>   *cur2.pr        0.1892    cur2(1)的实部
   *cur2.pi        0.0013    cur2(1)的虚部
</PRE>
      <H3>三、 C++Builder调用Matlab工具箱 <BR>函数转换后的DLL </H3><FONT 
      color=#ffffff>----</FONT>1. Matlab函数向DLL的转化 
      <P><FONT 
      color=#ffffff>----</FONT>Mediva软件提供了将Matlab函数转换为DLL的功能,非常方便。但需要注意的是: 
      <UL>
        <LI>Matlab5.0以上版本,所有带有tf类的函数均无法转换; 
        <LI>Matlab4.2以下版本,多数函数能够转换,但转换后大多不能直接使用,而必须加以处理。</LI></UL>
      <P><FONT color=#ffffff>----</FONT> MATCOM V4.3中把含有输入参数的M文件转换成 
      DLL时,生成的DLL无法调用。以.M为例: <PRE>  function [x1,x2]=flower(x3)
 </PRE>
      <P><FONT color=#ffffff>----</FONT>MATCOM生成的FLOWER.CPP和FLOWER.H中声明为: <PRE>Mm flower(Mm x3, i_o_t, Mm& x1__o, Mm& x2__o) {
    	begin_scope
    	x3.setname(“x3"); 
    	...
  }

   Mm flower(Mm x3);
   Mm flower(Mm x3, i_o_t, Mm& x1__o, Mm& x2__o);
</PRE>
      <P><FONT color=#ffffff>----</FONT>而生成的G_FLOWER.CPP声明为: <PRE>    void DLLX _stdcall flower_1_1(Mm** in01, Mm**out01) 
     void DLLX _stdcall flower_1_2
     (Mm** in01, Mm**out01, Mm**out02)     
</PRE>
      <P><FONT 
      color=#ffffff>----</FONT>其中对于in01的说明是不正确的,应按如下修改,然后,按如下MAKE文件进行编译。 <PRE>#
# MATCOM makefile

all: flower.dll

g_flower.obj: g_flower.cpp
bcc32-c-Id:\matcom43\-WD-Id:\matcom43\lib
-H=matlib.csm-a4-5-eg_flower.obj g_flower.cpp

flower.dll: flower.obj g_flower.obj 
bcc32-Ld:\matcom43\-WD-Id:\matcom43\lib
-H=matlib.csm-a4-5-eflower.dll @flower.rsp 
d:\matcom43\lib\mdv4300b.lib
</PRE>
      <P><FONT color=#ffffff>----</FONT>在CPP中调用这个函数之前,一定要先给in01分配空间。 <PRE> #include“matlib.h"
 #pragma hdrstop
  
 #include“flower.h"
  
 #define WIN32_LEAN_AND_MEAN
 #include <WINDOWS.H>
 #include“matlib.h"
 #pragma hdrstop
  
  extern“C" {
    void DLLX _stdcall flower_1_1(Mm in01, Mm**out01) {
     *out01=new Mm(); 
      //*in01=new Mm();
     **out01=flower(in01);
      exitM();
    }
    
void DLLX _stdcall flower_1_2(Mm in01, Mm*
 *out01, Mm**out02) {
     *out01=new Mm();*out02=new Mm(); 
      //*in01=new Mm();      
      flower(in01, i_o ,**out01,**out02);
      exitM();
}
</PRE></TD></TR></TBODY></TABLE>
<SCRIPT language=JavaScript> 
function adbn(sname,pname) 
{
var  Jtoday= new Date();jt=Jtoday.getTime();
var tilex='';
var catex='';
var sizex='1x1';
var w=1;h=1;
var adname='.cn';
document.write('<table border=0><tr><td>');
document.write('<A HREF="http://ad'+adname+'.doubleclick.net/jump/'+sname+pname+';sz='+sizex+';'+catex+tilex+'ord='+jt+'?" target=_blank><IMG SRC="http://ad'+adname+'.doubleclick.net/ad/'+sname+pname+';sz='+sizex+';'+catex+tilex+'ord='+jt+'?" border=0 height="'+h+'" width="'+w+'"></A>');
document.write('</td></tr></table>');
}
</SCRIPT>

<SCRIPT language=JavaScript>
adbn('www.ccw.com.cn/','week');
</SCRIPT>
<BR>
<TABLE align=center>
  <TBODY>
  <TR>
    <TD colSpan=7>
      <HR color=#f46240 SIZE=1 width=660>
    </TD></TR>
  <TR>
    <TD align=middle colSpan=7><BR>周报全文频道联系方式:010-68096699-812</TD></TR>
  <SCRIPT language=Javascript>
function AddBookMark(theTip)
{
  theSite=window.location;
  window.external.AddFavorite(theSite,theTip)
}
</SCRIPT>

  <TR>
    <TD align=middle><A href="http://www2.ccw.com.cn/pub/about.asp" 
      target=_blank>【关于我们】</A></TD>
    <TD align=middle><A href="http://www2.ccw.com.cn/pub/serv.asp" 
      target=_blank>【广告服务】</A></TD>
    <TD align=middle><A href="http://www2.ccw.com.cn/pub/contribute.asp" 
      target=_blank>【投稿指南】</A></TD>
    <TD align=middle><A href="http://www2.ccw.com.cn/pub/contact.asp" 
      target=_blank>【联系方式】</A></TD>
    <TD align=middle><A href="http://www2.ccw.com.cn/pub/clause.asp" 
      target=_blank>【法律声明】</A></TD></TR>
  <TR>
    <TD align=middle colSpan=5>Copyright(C) ccw.com.cn,All rights reserved 
  </TD></TR>
  <TR>
    <TD align=middle 
colSpan=7><B>中国计算机世界出版服务公司版权所有</B></TD></TR></TBODY></TABLE></CENTER></BODY></HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -