久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

VC與Matlab混合編程(在VC中調(diào)用DLL)

 DCC No.1 2011-05-12
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

    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn),。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多