Matlab 作為當(dāng)今世界上應(yīng)用最為廣泛的數(shù)學(xué)軟件, 具有非常強(qiáng)大的數(shù)值計(jì)算,、數(shù)據(jù)分析處理,、系統(tǒng)分析、圖形顯示甚至符號運(yùn)算的功能,。已經(jīng)在如生物工程,,圖像處理,語音處理,,雷達(dá)探空,,聲納探水,地震探地,,以及控制論,,系統(tǒng)論等各個(gè)領(lǐng)域得到廣泛的應(yīng)用,。它是一個(gè)完整的數(shù)學(xué)平臺,在這個(gè)平臺上,,用戶只需寥寥數(shù)語就可以完成十分復(fù)雜的功能,,大大提高了工程分析計(jì)算、圖像處理的效率,。但是Matlab 強(qiáng)大的功能只能在它所提供的平臺上才能使用,,即用戶必須在安裝Matlab 系統(tǒng)的機(jī)器上才能執(zhí)行*.m 文件。這樣當(dāng)用戶需要將在Matlab 下已開發(fā)完畢的復(fù)雜算法應(yīng)用到高級語言開發(fā)環(huán)境下時(shí)就帶來了問題,,是將現(xiàn)成的東西集成高級語言開發(fā)的程序中呢,?還是用高級語言再重新實(shí)現(xiàn)一遍?顯然大家所期望的是減少工作量,, 最好能將Matlab下開發(fā)好的程序或函數(shù)直接應(yīng)用到高級語言開發(fā)的程序中,,這就是Matlab與高級語言的混合編程問題。
VC++是當(dāng)前Windows 下的主要編程語言之一,,它能方便地形成應(yīng)用軟件中所需要的各種用戶界面和工具并直接與系統(tǒng)及底層硬件交換數(shù)據(jù),。用VC++開發(fā)的系統(tǒng)具有容易維護(hù)升級、界面友好,、代碼效率高,、執(zhí)行速度快等一系列優(yōu)點(diǎn),因此已成為目前應(yīng)用軟件開發(fā)中廣泛采用的主要工具之一,。因此,,如何將Matlab與VC++進(jìn)行有效的混合編程廣受工程科研人員的關(guān)注。解決這個(gè)問題,,不僅能更好地發(fā)揮Matlab 強(qiáng)大的功能,,還能快速地進(jìn)行軟件開發(fā),尤其是當(dāng)軟件開發(fā)中需要實(shí)現(xiàn)復(fù)雜的數(shù)學(xué)算法,、圖形處理時(shí)尤為迫切,。研究VC++與Matlab的混合編程具有很大的實(shí)際意義。
MATLAB 與Visual C++結(jié)合的方法有多種,,但其實(shí)用程度與范圍不同,。目前主要有以下三種方式,。
1. 通過Matlab引擎(Engine)
采用客戶機(jī)/服務(wù)器(Client/Service)的計(jì)算模式,通過windows的ActiveX通道和MATLAB進(jìn)行結(jié)合,。MATLAB引擎采用客戶機(jī)和服務(wù)器計(jì)算方式,提供了一組Matlab API函數(shù),,用戶不必關(guān)心Matlab引擎是如何實(shí)現(xiàn)的,,只要調(diào)用這些函數(shù)即可。正是通過這些API函數(shù)實(shí)現(xiàn)應(yīng)用程序進(jìn)程之間的傳遞函數(shù),,從而實(shí)現(xiàn)Matlab與VC的混合編程,。具體應(yīng)用中,,往往在VC中設(shè)計(jì)程序框架, VC的C語言或C++語言的程序作為前端客戶機(jī),它向Matlab引擎?zhèn)鬟f命令和數(shù)據(jù)信息,,通過調(diào)用MATLAB引擎在后臺與MATLAB服務(wù)器建立連接,實(shí)現(xiàn)動(dòng)態(tài)通信,。這種處理方法不要求鏈接整個(gè)Matlab,只需嵌入必要的Matlab引擎庫,節(jié)省了大量的系統(tǒng)資源,,使應(yīng)用程序整體性能更好,,處理效率更高,但這種混合編程的方法需要MATLAB在后臺適時(shí)運(yùn)行不能脫離Matlab環(huán)境,,否則影響了程序的通用性,,因此這種方法在實(shí)際開發(fā)過程中很少采用。
2. 通過DLL實(shí)現(xiàn)混合編程
DLL是動(dòng)態(tài)鏈接庫的英文縮寫,,是一個(gè)可執(zhí)行的二進(jìn)制文件,。把很多通用的功能放在DLL 中,可供多個(gè)應(yīng)用程序調(diào)用,,而不是每個(gè)應(yīng)用程序在連接時(shí)都要增加一個(gè)庫中目標(biāo)代碼的拷貝,。通過Matlab自帶的Compiler編譯器,可以把由Matlab編寫的m 函數(shù)文件編譯成動(dòng)態(tài)鏈接庫(dl1),?;蛘咄ㄟ^Matlab提供的組件功能,運(yùn)用VC+十向?qū)ё詣?dòng)生成m文件的動(dòng)態(tài)鏈接庫,。在VC程序中調(diào)用封裝的函數(shù),,實(shí)現(xiàn)數(shù)值算法的運(yùn)用。這種方法只需在開發(fā)和發(fā)布中包含其生成的動(dòng)態(tài)庫就可以了,,可以使程序脫離Matlab可以整體減少文件外部存儲空間的占有量,,并實(shí)現(xiàn)了代碼共享。
3.使用COM技術(shù)實(shí)現(xiàn)混合編程
COM技術(shù)是一種應(yīng)用廣泛,、方便靈活的方法,,是利用MATLAB提供的Deploy Tool工具實(shí)現(xiàn)MATLAB與C/C++的混合編程。COM給軟件開發(fā)人員提供了一種共享二進(jìn)制代碼的方法,,這種共享并不局限于某種編程語言,。
VC與Matlab混合編程(在VC中調(diào)用DLL)的實(shí)現(xiàn)
本人所用系統(tǒng)為windows7旗艦版,MATLAB為R2008a和Microsoft Visual C++6.0編程環(huán)境,。
一,、 MATLAB編譯環(huán)境的設(shè)置
為了能夠使用MATLAB的Complier將*.m函數(shù)文件編譯為動(dòng)態(tài)鏈接庫DLL,必須對MATLAB的環(huán)境做出相應(yīng)的設(shè)置,。具體做法如下:
在MATLAB的Command Window下輸入命令 mbuild –setup,并根據(jù)MATLAB的提示選擇合適的編譯器,,筆者使用的是Microsoft Visual C++6.0,進(jìn)行對C++連接環(huán)境的設(shè)置。過程如下:
>> mbuild -setup
Please choose your compiler for building standalone MATLAB applications:
Would you like mbuild to locate installed compilers [y]/n? y
Select a compiler:
[1] Lcc-win32 C 2.4.1 in D:\PROGRA~1\MATLAB\R2008a\sys\lcc
[2] Microsoft Visual C++ 2005 in d:\Program Files\Microsoft Visual Studio 8
[3] Microsoft Visual C++ 6.0 in D:\Program Files\Microsoft Visual Studio
[0] None
Compiler: 3
Please verify your choices:
Compiler: Microsoft Visual C++ 6.0
Location: D:\Program Files\Microsoft Visual Studio
Are these correct [y]/n? y
Trying to update options file:
C:\Documents and Settings\hk\Application Data\MathWorks\MATLAB\R2008a
\compopts.bat
From template: D:\PROGRA~1\MATLAB\R2008a\bin\win32\mbuildopts\msvc60compp.bat
Done . . .
在MATLAB的Command Window下輸入命令 mex –setup,進(jìn)行對編譯環(huán)境的設(shè)置,。過程如下:
>> mex -setup
Please choose your compiler for building external interface (MEX) files:
Would you like mex to locate installed compilers [y]/n? y
Select a compiler:
[1] Lcc-win32 C 2.4.1 in D:\PROGRA~1\MATLAB\R2008a\sys\lcc\bin
[2] Microsoft Visual C++ 2005 in d:\Program Files\Microsoft Visual Studio 8
[3] Microsoft Visual C++ 6.0 in D:\Program Files\Microsoft Visual Studio
[0] None
Compiler: 3
Please verify your choices:
Compiler: Microsoft Visual C++ 6.0
Location: D:\Program Files\Microsoft Visual Studio
Are these correct [y]/n? y
Trying to update options file: C:\Documents and Settings\hk\Application Data\MathWorks\MATLAB\R2008a\mexopts.bat
From template: D:\PROGRA~1\MATLAB\R2008a\bin\win32\mexopts\msvc60opts.bat
Done . . .
*********************************************************************
Warning: The MATLAB C and Fortran API has changed to support MATLAB
variables with more than 2^32-1 elements. In the near future
you will be required to update your code to utilize the new
API. You can find more information about this at:
http://www./support/solutions/data/1-5C27B9.html?solution=1-5C27B9 Building with the -largeArrayDims option enables the new API.
*********************************************************************
二,、創(chuàng)建動(dòng)態(tài)鏈接DLL
這里我們用的方法就是使用MATLAB的mcc命令將*.m文件編譯為動(dòng)態(tài)鏈接庫(*.dll),。
關(guān)于mcc有很多參數(shù)可以使用,而且有多種用法,,具體的可以參見MATLAB的幫助,。
其中MATLAB提供了三種使用MATLAB編譯器的方式:
(1) 在MATLAB環(huán)境中使用mcc命令;
(2) 在系統(tǒng)命令環(huán)境中使用mcc.exe(在Windows上),;
(3) 在MATLAB環(huán)境中使用Deployment Tool.
前兩種方式所需要的命令行參數(shù)是一樣的,。
假設(shè)要把file1.m和file2.m編譯成可執(zhí)行文件:
mcc –m file1 file2
假設(shè)要把file1.m和file2.m編譯成C語言動(dòng)態(tài)鏈接庫文件:
mcc –w lib:mylib –T link:lib file1.m file2.m
假設(shè)要把file1.m和file2.m編譯成C++語言動(dòng)態(tài)鏈接庫文件:
mcc –w cpplib:mycpplib –T link file1.m file2.m
三、使用MATLAB編譯器和VC6.0實(shí)現(xiàn)混合編程(通過例子說明)
1,、MATLAB中的操作
(1)創(chuàng)建mccdemol.m文件,,內(nèi)容如下:
(2) 在MATLAB命令行下,將mccdemol.m編譯成C++動(dòng)態(tài)鏈接庫文件,??梢詧?zhí)行如下命令:(帶圖形的和不帶圖形的有區(qū)別,這里主要是帶圖形的編譯)
>> mcc -W cpplib:libmccdemol -T link:lib mccdemol.m
命令執(zhí)行完成后,,將在工作目錄產(chǎn)生使用MATLAB編譯生成庫文件所需的相關(guān)文件,。
2、建立VC對話框工程
創(chuàng)建一個(gè)基于MFC對話框的工程,,工程名稱為MccDemol,如下圖所示:
設(shè)計(jì)對話框界面如圖:
在文件MccDemolDlg.cpp : implementation file中包含頭文件,,如下所示:
#include "libmccdemol.h"
修改對話框的初始函數(shù)如下:
BOOL CMccDemolDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
bool res = false;
res = mclInitializeApplication(NULL,0);
if (!res)
{
MessageBox("初始化Application錯(cuò)誤!");
}
res = libmccdemolInitialize();
if (!res)
{
MessageBox("初始化Lib錯(cuò)誤,!");
}
return TRUE; // return TRUE unless you set the focus to a control
}
為對話框添加WM_DESTROY消息,,使用快捷鍵“Ctrl+W”,調(diào)出MFC Class Wizard對畫框,如下圖所示:
添加如下消息響應(yīng)函數(shù):
void CMccDemolDlg::OnDestroy()
{
CDialog::OnDestroy();
// TODO: Add your message handler code here
bool res;
res = mclTerminateApplication();
if (!res)
{
MessageBox("結(jié)束程序錯(cuò)誤!");
}
libmccdemolTerminate();
}
為確定按鈕添加消息響應(yīng)函數(shù)
void CMccDemolDlg::OnButtonRun()
{
// TODO: Add your control notification handler code here
mccdemol();
mclWaitForFiguresToDie(NULL);
}
本例中用到了MATLAB圖形功能,,所示使函數(shù)“mclWaitForFiguresToDie(NULL)”,,在沒有用到MATLAB的圖形功能的庫文件時(shí),不需要此函數(shù),。
3,、VC中的設(shè)置
將在MATLAB環(huán)境下編譯后的生成文件“libmccdemol.h”、“libmccdemol.dll”,、“libmccdemol.lib”和“libmccdemol.ctf”(這個(gè)文件在有的編譯器下生成后瞬間消失,,如本例中,所以建議如果生成有的話,,就將其添加,,如沒有就不用了。CTF文件見后面注釋)復(fù)制到當(dāng)前工程目錄,。
為工程添加庫文件“libmccdemol.lib”和“mclmcrrt.lib”,,如下圖所示,。
編譯運(yùn)行工程,,可以看到運(yùn)行結(jié)果,,單擊確定按鈕,彈出Figure窗口,。這與MATLAB環(huán)境下直接運(yùn)行的結(jié)果相同,。
本文來自CSDN博客,轉(zhuǎn)載請標(biāo)明出處:http://blog.csdn.net/hahalxp/archive/2010/03/25/5415257.aspx 本文來自CSDN博客,,轉(zhuǎn)載請標(biāo)明出處:http://blog.csdn.net/hahalxp/archive/2010/03/25/5415257.aspx
|
|