Matlab與VC混合編程

MatlabVC混合編程


關(guān)鍵詞:Matlab VC 混合編程 可執(zhí)行程序


介:本文介紹了一種將Matlab編譯成可執(zhí)行程序的一種方法,它使得Matlab編寫的程序能夠完全脫離Matlab這個環(huán)境來執(zhí)行,從而大大提高了程序的應(yīng)用范圍和使用價值。


眾所周知,MATLAB是一套功能非常強大的商業(yè)數(shù)學(xué)軟件,從信號處理,語音處理,數(shù)據(jù)采集,數(shù)值運算,圖像處理,到電子仿真,金融分析等等,幾乎在各個工業(yè)領(lǐng)域,他都已經(jīng)得到了廣泛應(yīng)用,同時也取得了巨大的成功。


但是,由于Matlab是用一種腳本語言,他的解釋是逐行執(zhí)行的,程序中所有的變量都是用MxArray來實現(xiàn)的,所以為了保證通用性,它的執(zhí)行效率非常低,這就是我們常常看到的:在開發(fā)一些復(fù)雜的算法時,通常會發(fā)現(xiàn)程序執(zhí)行得特別慢,雖然Mathworks公司已經(jīng)在竭力提高m腳本文件(script files)的運算速度,但目前為止效果仍然不能和實現(xiàn)同樣功能的可執(zhí)行程序相比。而且m腳本文件是不能脫離Matlab這個應(yīng)用程序環(huán)境,這就大大制約了程序的可移植性和通用性。


本文的目的正是基于上述考慮,介紹如何利用matlab提供的C/C++編譯器,將m文件編譯成可執(zhí)行的應(yīng)用程序。作者是用的編譯環(huán)境是:MS VC++ 6.0和Matlab6.5。



一、 MATLAB中的操作


1.沒有使用圖形相關(guān)的函數(shù)


由于MATLAB的編譯器只能對函數(shù)m文件進行編譯,所以如果原來的程序是腳本程序應(yīng)改寫成函數(shù)形式。舉例如下:


建立一個m文件test1.m,內(nèi)容如下:


function y = test1(n)


y = 1 ;


for i = 1 : n


y = y * i ;


end


用如下命令對其進行編譯:”


mcc –t –L CPP –h test1.m


(如果程序由多個m文件組成,在編譯命令中只需要指定主文件即可,mcc會自動查找相應(yīng)的m文件進行編譯)


編譯完成后會得到與m文件名相對應(yīng)hpp和cpp文件,本例中是test1.hpp和test1.cpp。


2. 使用了圖形相關(guān)的函數(shù)


建立一個m文件test2.m,內(nèi)容如下:


function test2


plot(rand(10));


用如下命令編譯:


mcc –p –B sglcpp test2.m


(如果程序由多個文件組成,處理方法同上)


編譯完成后得到與m文件名相對應(yīng)的hpp和cpp文件、一個主函數(shù)文件、bin目錄中的兩個Fig文件以及一個exe文件。我們需要的只是與m文件相對應(yīng)的hpp文件、cpp文件以及bin目錄中的兩個fig文件,本例中是test2.hpp,test2.cpp以及bin目錄中的FigureMenuBar.fig和FigureToolBar.fig。



二、 VC中的操作


相比MATLAB中的操作,VC中需要設(shè)置眾多的編譯選項,顯得比較復(fù)雜。另外,VC中可選的工程類型比較多,本文將說明MATLAB編譯得到的源程序在如下工程類型中的使用


MFC Appwizard(exe) (Dialog Based)


Win32 Console Application


Win32 Application


其實在這幾種類型的工程中大部分的操作都是相同的,本文先描述相同的操作,再說明不同的部分。


1.用VC建立相應(yīng)類型的工程,把第一步中提到的源程序拷貝到工程所在目錄中。


2.選擇菜單Tools-Options-在屬性頁中選擇Directories-下拉框中選擇Include Files,在其最后加入


E:\MATLAB6P5\EXTERN\INCLUDE\CPP


E:\MATLAB6P5\EXTERN\INCLUDE


其中E:\MATLAB6P5為MATLAB的安裝路徑,如下圖所示:













再在下拉框中選擇Library Files,在最后加入


E:\MATLAB6P5\EXTERN\LIB\WIN32\MICROSOFT\MSVC60


E:\MATLAB6P5\EXTERN\LIB\WIN32


如下圖所示:














3. 選擇菜單Project-Settings-屬性頁Link-下拉列表中選擇Input,在Object/library modules文本框中加入 libmmfile.lib libmatlb.lib libmx.lib libmat.lib libmatpm.lib sgl.lib libmwsglm.lib libmwservices.lib


注意下面的Ignore Libraries文本框,這里需要根據(jù)不同的工程類型進行填寫,稍后再分情況說明。如下圖所示:



4. 選擇C/C++屬性頁,在下拉列表中選擇Preprocessor,在Preprocessor definitions中加入MSVC,IBMPC,MSWIND如下圖所示:














再在下拉框中選擇Precomplied Headers,選中Automatic use of precompiled headers,在其中填入stdafx.h,如下圖


















5.菜單Project-Add To Project-Files把所有拷貝過來的cpp文件加入到當前工程中。



下面再依各種不同類型的工程具體說明


1. MFC Appwizard(exe) (Dialog Based)


(僅以帶圖形函數(shù)的為例,所以需要把test2.hpp和test2.cpp以及兩個fig文件拷貝到當前工程中)在主對話框上添加一個Button,并添加按鈕的相應(yīng)函數(shù)OnButton1。


在按鈕響應(yīng)函數(shù)所在文件中添加如下代碼:


#include "test2.hpp"


在按鈕相應(yīng)函數(shù)中添加如下代碼:


test2();


在對話框類的OnInitDialog函數(shù)中添加如下代碼:


libmmfileInitialize();


libmwsglmInitialize();


mlfHGInitialize(NULL,NULL);


在對話框的消息WM_DESTROY的處理函數(shù)OnDestroy()中加入如下代碼:


mlfHGTerminate();


libmmfileTerminate();


libmwsglmTerminate();


在上面提到的Ignore Libraries里加入msvcrt.lib,此時即可以編譯成功了。


2. Win32 Console Application


這里建立了一個支持MFC的程序,以不帶圖形的函數(shù)為例,把test1.hpp和test1.cpp拷貝到當前工程中,


#include "stdafx.h"下面加入


#include "matlab.hpp"


#include "test1.hpp"


// TODO: code your application's behavior here.下面加入如下代碼:


mwArray y,n;


n = 3;


y = test1(n);


double *py = mxGetPr(y.GetData());


printf("%f\n",*py);


在上面提到的Ignore Libraries里加入msvcrt.lib,由于MATLAB的庫函數(shù)與VC的輸入輸出函數(shù)cout、cin、cerr沖突,所以需要把MFC生成的代碼中


cerr << _T("Fatal Error: MFC initialization failed") << endl;一行刪掉,并且在以后的代碼中頁不能有cout、cin、cerr。


3. Win32 Application


選擇建立"A simple Win32 Application",這樣的工程中默認是沒有主窗口的,只有一個WinMain函數(shù),以帶圖形的函數(shù)為例,把test2.hpp test2.cpp以及


FigureMenuBar.fig和FigureToolBar.fig拷貝到當前工程中。


在#include "stdafx.h"下面添加


#include "test2.hpp"


在WinMain函數(shù)中添加如下代碼:


libmmfileInitialize();


libmwsglmInitialize();


mlfHGInitialize(NULL,NULL);


test2();


mlfHGWaitForFiguresToDie();


mlfHGTerminate();


libmmfileTerminate();


libmwsglmTerminate();


此時編譯能夠成功,但會出現(xiàn)兩個警告信息,在Ignore Libraries里加入msvcrt.lib,libcd.lib即可去除該信息。



三、 程序的發(fā)布


由于程序中調(diào)用了MATLAB數(shù)學(xué)函數(shù)庫或圖形庫中的函數(shù),所以需要附帶MATLAB的這些函數(shù)庫才能在沒有安裝MATLAB的機器上運行。幸好MATLAB已經(jīng)把這兩個庫的函數(shù)打包了,這樣就省得我們一個一個去搜集了。該文件就是位于matlab安裝目錄中extern\lib\win32子目錄中的mglarchive.exe。運行該程序即可自動把需要的庫函數(shù)解壓到當前目錄中,把編譯好的程序放到該目錄中拷貝到未裝matlab的機器上即可實現(xiàn)脫離matlab。




作者簡介:


姓名:苗春葆
性別:男
工作單位:國家海洋信息中心
畢業(yè)院校:中國海洋大學(xué)
所學(xué)專業(yè):物理海洋學(xué)
編程語言:Matlab,Fortran,VB,VC



參考書目:


Matlab? USER Manual


Microsoft MSDN

轉(zhuǎn)自:http://www.simwe.com/jour/prog/p001008.htm

登錄后免費查看全文
立即登錄
App下載
技術(shù)鄰APP
工程師必備
  • 項目客服
  • 培訓(xùn)客服
  • 平臺客服

TOP

2