《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 其他 > 設(shè)計(jì)應(yīng)用 > 基于MATCOM的MATLAB與VC混合編程技術(shù)研究
基于MATCOM的MATLAB與VC混合編程技術(shù)研究
吳高峰1,李熙瑩2
摘要: 研究了基于MATCOM的MATLAB與VC混合編程技術(shù),提出了一種簡便的設(shè)置MATCOM環(huán)境的方法,介紹了MATCOM提供的一個(gè)方便調(diào)試工具——矩陣查看器及其具體使用方法。結(jié)合實(shí)例,詳細(xì)介紹了基于MATCOM的混合編程的實(shí)現(xiàn)途徑,對擴(kuò)展MATCOM的功能提出了一種獨(dú)到的解決辦法。
Abstract:
Key words :

  摘 要: 研究了基于MATCOM的MATLAB與VC混合編程技術(shù),提出了一種簡便的設(shè)置MATCOM環(huán)境的方法,介紹了MATCOM提供的一個(gè)方便調(diào)試工具——矩陣查看器及其具體使用方法。結(jié)合實(shí)例,詳細(xì)介紹了基于MATCOM的混合編程的實(shí)現(xiàn)途徑,對擴(kuò)展MATCOM的功能提出了一種獨(dú)到的解決辦法。
  關(guān)鍵詞: MATCOM;MATLAB;VC;混合編程

   MATLAB是MathWorks公司推出的數(shù)學(xué)軟件,它將數(shù)值分析、矩陣計(jì)算、信號處理、數(shù)據(jù)采集和圖形顯示結(jié)合在一起,包含大量高度集成的函數(shù)可供調(diào)用。現(xiàn)在,MATLAB幾乎在各個(gè)領(lǐng)域都得到了廣泛的應(yīng)用,也取得了巨大的成功,被稱為第四代編程語言。
  但是MATLAB使用的是解釋性語言,這大大限制了它的執(zhí)行速度,而且用MATLAB開發(fā)的程序只局限于MATLAB運(yùn)行環(huán)境而不能作為商業(yè)軟件。
  VC作為Windows平臺下主要的應(yīng)用程序開發(fā)環(huán)境之一,能方便實(shí)現(xiàn)軟件開發(fā),但在工程計(jì)算及可視化方面,與MATLAB相比編程顯得復(fù)雜很多,因此,將VC與MATLAB混合編程,必將為軟件開發(fā)帶來便利。
  本文介紹基于MATCOM的混合編程方法。示例中用到的軟件為MATLAB R2009A和VC 6.0。為了便于敘述,用VC6.0新建一個(gè)基于對話框的程序TestMatcom。
1 MATCOM簡介
    MathTools公司有一系列的產(chǎn)品,包括MIDEVA、MATCOM、Visual MATCOM、Matrix 。其中Matrix 是所有產(chǎn)品的核心,它是一個(gè)C++數(shù)學(xué)圖形圖像庫,里面包含了約600個(gè)經(jīng)過嚴(yán)格測試的函數(shù),是實(shí)現(xiàn)將M文件轉(zhuǎn)化為C++文件的基礎(chǔ)。MATCOM是基于Matrix 的一個(gè)編譯器,Visual MATCOM可以看成是一個(gè)集成到VC環(huán)境中的MATCOM。而MIDEVA是M文件的解釋器和集成開發(fā)環(huán)境,它通過一個(gè)完整而強(qiáng)大的開發(fā)和運(yùn)行M文件的環(huán)境包含并拓展了MATCOM的功能,可以和MATLAB相媲美。為了方便,通常將MathTools公司的這些產(chǎn)品統(tǒng)稱為MATCOM。本文在不引起混淆的情況下不作區(qū)分。
2 MATCOM的安裝與配置
  MATCOM的安裝與普通Windows程序的安裝過程類似,可參考文獻(xiàn)[1]、[2]所述。成功安裝后,在目錄C:\matcom45\lib下可找到matlib.h及v4501v.lib這2個(gè)文件,在Windows操作系統(tǒng)的system32目錄下可找到v4501v.dll和ago4501.dll這2個(gè)文件。將這4個(gè)文件拷貝到TestMatcom工程中再做如下配置即可:
  (1)在VC的FileView標(biāo)簽中的Resource Files目錄上點(diǎn)擊右鍵->Add Files to Folder->文件類型選擇“Library Files(.lib)”->選中v4501v.lib ->點(diǎn)擊“OK”即添加成功。
    (2)在需要使用MATCOM函數(shù)的文件中添加#include "matlib.h"。本文示例在TestMatcomDlg.cpp中添加。
    (3)在使用MATCOM的函數(shù)之前,添加初始化語句:initM(MATCOM_VERSION)。本文示例在void CTestMatcomDlg::OnPaint()函數(shù)中添加。
    (4)在使用MATCOM的函數(shù)之后,添加釋放資源語句:exitM()。本文示例也在void CTestMatcomDlg::OnPaint()函數(shù)中添加。
    為了使Visual MATCOM可用,也需做相應(yīng)的配置,參考文獻(xiàn)[1]、[3]介紹了配置的過程,本文從略。
3 巧用矩陣查看器
  安裝完Visual MATCOM之后可以看到Visual MATCOM工具欄中有個(gè)眼鏡按鈕,這個(gè)就是矩陣查看器。在調(diào)試模式下可以通過它查看MATCOM矩陣的值,這對VC程序調(diào)試是非常方便的。在VC中,指針變量和數(shù)組尤其是二維及以上的指針變量和數(shù)組的元素值是不方便查看的。有了這個(gè)工具,就可以將需要查看的指針變量或數(shù)組的值傳遞給MATCOM矩陣,然后在矩陣查看器中查看[3]。具體的查看方法是:在相應(yīng)位置設(shè)置斷點(diǎn),當(dāng)VC程序運(yùn)行到斷點(diǎn)停下后,點(diǎn)擊矩陣查看器按鈕,然后在矩陣名對話框里輸入矩陣名,并點(diǎn)擊Reload按鈕,矩陣的內(nèi)容即可顯示出來。另外,為了使得矩陣查看器能在程序中起作用,需要在VC程序中添加:unsigned int mlibpr=mt_set_MT(0)。
  示例:
  /*定義1個(gè)二維數(shù)組*/
    double a[2][3]={1,2,3,4,5,6}; 
    /*定義1個(gè)Mm 矩陣,
    并初始化為2行3列,元素都為0*/
    Mm ma=zeros(2,3); 
    /*將數(shù)組元素復(fù)制到ma中*/ 
    memcpy((char*)ma.addr( ),(char*)a,6*sizeof(double));
4 混合編程的實(shí)現(xiàn)
  混合編程有不同的實(shí)現(xiàn)途徑,本文將其分為二大類。
4.1 將M文件轉(zhuǎn)化為C++代碼
  M文件可分為腳本文件和函數(shù)文件兩大類。這兩者的混合編程實(shí)現(xiàn)步驟略有不同?,F(xiàn)以2個(gè)示例說明。
    例1:
      %wires.m
      n=1000;
      t=inspace(0,2*pi,n);
      x=sin(t).*sin(2*t).*sin(3*t);
      y=cos(5*t).*cos(7*t).*cos(11*t);
      plot(x, y);
  雙擊桌面上的MIDEVA圖標(biāo)打開MIDEVA,然后在MIDEVA菜單欄中選File->Compile to exe,在彈出的Go command對話框中通過瀏覽選擇wires.m這個(gè)文件,然后點(diǎn)擊OK.轉(zhuǎn)化成功后可以在C:\matcom45\Debug下找到wires.cpp這個(gè)文件。打開這個(gè)文件,可以看到內(nèi)容為(刪去不需要的代碼,注釋為筆者添加,欲全面了解M文件與其對應(yīng)的CPP文件的關(guān)系,可以參考文獻(xiàn)[2]):
  //Mm為處理矩陣的類
   Mm n; Mm t; Mm x; Mm y;
   n=1000.0; 
  t=linspace(0.0,2.0*pi,n);  
   x=times(times(sin(t),sin(2.0*t)),sin(3.0*t)); 
    /*MATLAB的點(diǎn)乘操作在VC里面通過times函數(shù)實(shí)現(xiàn)。*/
  y=times(times(cos(5.0*t),cos(7.0*t)),cos(11.0*t));
  plot((CL(x),y));/*輸入?yún)?shù)個(gè)數(shù)不定時(shí),需用CL函數(shù)。注意y不用加CL()*/
   可以看出,經(jīng)MATCOM轉(zhuǎn)化后的C++代碼和M代碼幾乎句句對應(yīng),可讀性強(qiáng)。將以上內(nèi)容拷貝到void CTestMatcomDlg::OnPaint()函數(shù)中,編譯運(yùn)行即可得到所需的結(jié)果。
    例2:
      %CreateMagic.m
    function result=CreateMagic(n)
      result=magic(n);
  用MATCOM成功轉(zhuǎn)化后可以在Debug目錄下找到CreateMagic.cpp和CreateMagic.h這2個(gè)文件。將其添加進(jìn)TestMatcom工程中并在TestMatcomDlg.cpp中添加1句:#include“CreateMagic.h”同時(shí)在消息響應(yīng)函數(shù)中添加代碼:“Mm a=5; Mm b=CreateMagic(a);”可驗(yàn)證b為5×5的魔方陣。若編譯不通過 ,可嘗試在CreateMagic.cpp文件中添加#include "stdafx.h"。
4.2 將M文件轉(zhuǎn)化為DLL
  出于代碼保密等原因,有時(shí)需要將M文件轉(zhuǎn)化為DLL以供其他程序調(diào)用,這時(shí)可以利用MATCOM的Compile to dll功能來實(shí)現(xiàn)。
    示例:
       %Exchange2.m
       function[c,d]=Exchange2(a,b)
       c=b;
       d=a;
    通過File->Compile to dll將該M文件轉(zhuǎn)化為dll,在Debug目錄下可找到Exchange2.lib和Exchange2.dll這2個(gè)文件,將其放入TestMatcom工程目錄下并在TestMatcomDlg.cpp中添加以下代碼:
    #pragma comment(lib, "Exchange2.lib")
    extern "C" int DLLX_stdcall Exchange2_v(char* emsg, int nlhs, Mm* plhs[ ], int nrhs, Mm* prhs[ ]); 
  MATCOM將M文件里面的函數(shù)Exchange2轉(zhuǎn)化成了Exchange2_v函數(shù),該函數(shù)的第1個(gè)參數(shù)emsg用于傳遞1個(gè)消息字符串,可賦值為NULL;第2個(gè)參數(shù)nlhs是Exchange2函數(shù)定義的輸出參數(shù)的個(gè)數(shù);第3個(gè)參數(shù)plhs[]是指向輸出參數(shù)的指針數(shù)組;第4個(gè)參數(shù)nrhs是Exchange2函數(shù)中定義的輸入?yún)?shù)的個(gè)數(shù);第5個(gè)參數(shù)prhs[ ]是指向輸入?yún)?shù)的指針數(shù)組。
    在消息響應(yīng)函數(shù)中添加如下代碼:
  Mm a, b, c, d;
  a=zeros(1,3);
  b=ones(1,3);
  b.r(1,2)=100;    /*將矩陣b的第1行第2列元素賦值為100  */ 
  Mm* Input[2]={&a,&b};
  Mm* Output[2];          //不用為其分配空間
  //調(diào)用dll函數(shù)
  Exchange2_v(NULL, 2, Output, 2,Input);
    //查看第1個(gè)輸出參數(shù)的結(jié)果
  Mm lookOutput1=*Output[0];
  //查看第2個(gè)輸出參數(shù)的結(jié)果
  Mm lookOutput2=*Output[1];
  即實(shí)現(xiàn)了調(diào)用dll里的Exchange2_v函數(shù)。
    MATLAB與C++混合編程的方法有8種之多。但是基于MATCOM的混合編程方法簡便易行,生成的代碼可讀性很好,筆者認(rèn)為是實(shí)現(xiàn)MATLAB與VC混合編程的最優(yōu)途徑。在實(shí)際工程應(yīng)用當(dāng)中,經(jīng)常會(huì)調(diào)用到很多的MATLAB工具箱函數(shù),而對于MATLAB 5.3版本以后新增的函數(shù)或者M(jìn)ATLAB工具箱函數(shù),MATCOM并沒有提供相對應(yīng)的函數(shù)。這時(shí)可以采用的解決辦法是:將用到的函數(shù)對應(yīng)的M文件(可從MATLAB安裝目錄中獲得)拷貝到與待轉(zhuǎn)化的M文件同一個(gè)目錄下,MATCOM會(huì)自動(dòng)進(jìn)行關(guān)聯(lián)分析并轉(zhuǎn)化。轉(zhuǎn)化完成后只需將生成的頭文件和源文件一起放到VC工程中就可以了。筆者在車牌識別系統(tǒng)中采用這種方法有效縮短了系統(tǒng)開發(fā)的周期和效率。
參考文獻(xiàn)
[1] MathTools Ltd. MIDEVA, MATCOM & visual MATCOM installation guide (V4.5 release).1999.
[2] 劉維.精通Matlab與C++混合程序設(shè)計(jì)[M].(第2版). 北京:北京航空航天大學(xué)出版社,2008:257-315.
[3] 羅蛟龍,張鵬,張維競.Visual C++下強(qiáng)大的科學(xué)運(yùn)算函數(shù)庫—MATCOM之Matrix [J].計(jì)算機(jī)工程,2000,
26(12):152-154.
[4] MathTools Ltd. Matrix user’s guide(V4.5 release). 1999.

此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載。