Matlab與VC混合編程
Matlab與VC混合編程
關(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
工程師必備
- 項目客服
- 培訓(xùn)客服
- 平臺客服
TOP




















