Matlab 作為當今世界上應用最為廣泛的數學(xué)軟件, 具有非常強大的數值計算、數據分析處理、系統分析、圖形顯示甚至符號運算的功能。已經(jīng)在如生物工程,圖像處理,語(yǔ)音處理,雷達探空,聲納探水,地震探地,以及控制論,系統論等各個(gè)領(lǐng)域得到廣泛的應用。它是一個(gè)完整的數學(xué)平臺,在這個(gè)平臺上,用戶(hù)只需寥寥數語(yǔ)就可以完成十分復雜的功能,大大提高了工程分析計算、圖像處理的效率。但是Matlab 強大的功能只能在它所提供的平臺上才能使用,即用戶(hù)必須在安裝Matlab 系統的機器上才能執行*.m 文件。這樣當用戶(hù)需要將在Matlab 下已開(kāi)發(fā)完畢的復雜算法應用到高級語(yǔ)言開(kāi)發(fā)環(huán)境下時(shí)就帶來(lái)了問(wèn)題,是將現成的東西集成高級語(yǔ)言開(kāi)發(fā)的程序中呢?還是用高級語(yǔ)言再重新實(shí)現一遍?顯然大家所期望的是減少工作量, 最好能將Matlab下開(kāi)發(fā)好的程序或函數直接應用到高級語(yǔ)言開(kāi)發(fā)的程序中,這就是Matlab與高級語(yǔ)言的混合編程問(wèn)題。
VC++是當前Windows 下的主要編程語(yǔ)言之一,它能方便地形成應用軟件中所需要的各種用戶(hù)界面和工具并直接與系統及底層硬件交換數據。用VC++開(kāi)發(fā)的系統具有容易維護升級、界面友好、代碼效率高、執行速度快等一系列優(yōu)點(diǎn),因此已成為目前應用軟件開(kāi)發(fā)中廣泛采用的主要工具之一。因此,如何將Matlab與VC++進(jìn)行有效的混合編程廣受工程科研人員的關(guān)注。解決這個(gè)問(wèn)題,不僅能更好地發(fā)揮Matlab 強大的功能,還能快速地進(jìn)行軟件開(kāi)發(fā),尤其是當軟件開(kāi)發(fā)中需要實(shí)現復雜的數學(xué)算法、圖形處理時(shí)尤為迫切。研究VC++與Matlab的混合編程具有很大的實(shí)際意義。
MATLAB 與Visual C++結合的方法有多種,但其實(shí)用程度與范圍不同。目前主要有以下三種方式。
1. 通過(guò)Matlab引擎(Engine)
采用客戶(hù)機/服務(wù)器(Client/Service)的計算模式,通過(guò)windows的ActiveX通道和MATLAB進(jìn)行結合。MATLAB引擎采用客戶(hù)機和服務(wù)器計算方式,提供了一組Matlab API函數,用戶(hù)不必關(guān)心Matlab引擎是如何實(shí)現的,只要調用這些函數即可。正是通過(guò)這些API函數實(shí)現應用程序進(jìn)程之間的傳遞函數,從而實(shí)現Matlab與VC的混合編程。具體應用中,往往在VC中設計程序框架, VC的C語(yǔ)言或C++語(yǔ)言的程序作為前端客戶(hù)機,它向Matlab引擎傳遞命令和數據信息,通過(guò)調用MATLAB引擎在后臺與MATLAB服務(wù)器建立連接,實(shí)現動(dòng)態(tài)通信。這種處理方法不要求鏈接整個(gè)Matlab,只需嵌入必要的Matlab引擎庫,節省了大量的系統資源,使應用程序整體性能更好,處理效率更高,但這種混合編程的方法需要MATLAB在后臺適時(shí)運行不能脫離Matlab環(huán)境,否則影響了程序的通用性,因此這種方法在實(shí)際開(kāi)發(fā)過(guò)程中很少采用。
2. 通過(guò)DLL實(shí)現混合編程
DLL是動(dòng)態(tài)鏈接庫的英文縮寫(xiě),是一個(gè)可執行的二進(jìn)制文件。把很多通用的功能放在DLL 中,可供多個(gè)應用程序調用,而不是每個(gè)應用程序在連接時(shí)都要增加一個(gè)庫中目標代碼的拷貝。通過(guò)Matlab自帶的Compiler編譯器,可以把由Matlab編寫(xiě)的m 函數文件編譯成動(dòng)態(tài)鏈接庫(dl1)?;蛘咄ㄟ^(guò)Matlab提供的組件功能,運用VC+十向導自動(dòng)生成m文件的動(dòng)態(tài)鏈接庫。在VC程序中調用封裝的函數,實(shí)現數值算法的運用。這種方法只需在開(kāi)發(fā)和發(fā)布中包含其生成的動(dòng)態(tài)庫就可以了,可以使程序脫離Matlab可以整體減少文件外部存儲空間的占有量,并實(shí)現了代碼共享。
3.使用COM技術(shù)實(shí)現混合編程
COM技術(shù)是一種應用廣泛、方便靈活的方法,是利用MATLAB提供的Deploy Tool工具實(shí)現MATLAB與C/C++的混合編程。COM給軟件開(kāi)發(fā)人員提供了一種共享二進(jìn)制代碼的方法,這種共享并不局限于某種編程語(yǔ)言。
VC與Matlab混合編程(在VC中調用DLL)的實(shí)現
本人所用系統為windows7旗艦版,MATLAB為R2008a和Microsoft Visual C++6.0編程環(huán)境。
一、 MATLAB編譯環(huán)境的設置
為了能夠使用MATLAB的Complier將*.m函數文件編譯為動(dòng)態(tài)鏈接庫DLL,必須對MATLAB的環(huán)境做出相應的設置。具體做法如下:
在MATLAB的Command Window下輸入命令 mbuild –setup,并根據MATLAB的提示選擇合適的編譯器,筆者使用的是Microsoft Visual C++6.0,進(jìn)行對C++連接環(huán)境的設置。過(guò)程如下:
>> 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)境的設置。過(guò)程如下:
>> 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:
*********************************************************************
二、創(chuàng )建動(dòng)態(tài)鏈接DLL
這里我們用的方法就是使用MATLAB的mcc命令將*.m文件編譯為動(dòng)態(tài)鏈接庫(*.dll)。
關(guān)于mcc有很多參數可以使用,而且有多種用法,具體的可以參見(jiàn)MATLAB的幫助。
其中MATLAB提供了三種使用MATLAB編譯器的方式:
(1) 在MATLAB環(huán)境中使用mcc命令;
(2) 在系統命令環(huán)境中使用mcc.exe(在Windows上);
(3) 在MATLAB環(huán)境中使用Deployment Tool.
前兩種方式所需要的命令行參數是一樣的。
假設要把file1.m和file2.m編譯成可執行文件:
mcc –m file1 file2
假設要把file1.m和file2.m編譯成C語(yǔ)言動(dòng)態(tài)鏈接庫文件:
mcc –w lib:mylib –T link:lib file1.m file2.m
假設要把file1.m和file2.m編譯成C++語(yǔ)言動(dòng)態(tài)鏈接庫文件:
mcc –w cpplib:mycpplib –T link file1.m file2.m
三、使用MATLAB編譯器和VC6.0實(shí)現混合編程(通過(guò)例子說(shuō)明)
1、MATLAB中的操作
(1)創(chuàng )建mccdemol.m文件,內容如下:
(2) 在MATLAB命令行下,將mccdemol.m編譯成C++動(dòng)態(tài)鏈接庫文件??梢詧绦腥缦旅睿海◣D形的和不帶圖形的有區別,這里主要是帶圖形的編譯)
>> mcc -W cpplib:libmccdemol -T link:lib mccdemol.m
命令執行完成后,將在工作目錄產(chǎn)生使用MATLAB編譯生成庫文件所需的相關(guān)文件。
2、建立VC對話(huà)框工程
創(chuàng )建一個(gè)基于MFC對話(huà)框的工程,工程名稱(chēng)為MccDemol,如下圖所示:
設計對話(huà)框界面如圖:
在文件MccDemolDlg.cpp : implementation file中包含頭文件,如下所示:
#include "libmccdemol.h"
修改對話(huà)框的初始函數如下:
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錯誤!");
}
res = libmccdemolInitialize();
if (!res)
{
MessageBox("初始化Lib錯誤!");
}
return TRUE; // return TRUE unless you set the focus to a control
}
為對話(huà)框添加WM_DESTROY消息,使用快捷鍵“Ctrl+W”,調出MFC Class Wizard對畫(huà)框,如下圖所示:
添加如下消息響應函數:
void CMccDemolDlg::OnDestroy()
{
CDialog::OnDestroy();
// TODO: Add your message handler code here
bool res;
res = mclTerminateApplication();
if (!res)
{
MessageBox("結束程序錯誤!");
}
libmccdemolTerminate();
}
為確定按鈕添加消息響應函數
void CMccDemolDlg::OnButtonRun()
{
// TODO: Add your control notification handler code here
mccdemol();
mclWaitForFiguresToDie(NULL);
}
本例中用到了MATLAB圖形功能,所示使函數“mclWaitForFiguresToDie(NULL)”,在沒(méi)有用到MATLAB的圖形功能的庫文件時(shí),不需要此函數。
3、VC中的設置
將在MATLAB環(huán)境下編譯后的生成文件“libmccdemol.h”、“libmccdemol.dll”、“libmccdemol.lib”和“libmccdemol.ctf”(這個(gè)文件在有的編譯器下生成后瞬間消失,如本例中,所以建議如果生成有的話(huà),就將其添加,如沒(méi)有就不用了。CTF文件見(jiàn)后面注釋?zhuān)椭频疆斍肮こ棠夸洝?/div>
為工程添加庫文件“libmccdemol.lib”和“mclmcrrt.lib”,如下圖所示。
編譯運行工程,可以看到運行結果,單擊確定按鈕,彈出Figure窗口。這與MATLAB環(huán)境下直接運行的結果相同。
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請
點(diǎn)擊舉報。