前言
該文檔是剛畢業時做項目時用到的一些VC MATLAB混編的内容,供大家分享,有什麼問題請大家批評指正。
VC MATLAB混編主要有兩種方式:
第一種是運用MATLAB引擎,該方法的優點是在轉成VC代碼的時候隻需要使用固定函數,然後将MATLAB代碼完全複制,最後将VC和MATLAB的變量轉換接口寫好就可以了。缺點是需要安裝整個MATLAB,依賴于MATLAB的自啟動,而且程序運行效率較差。
第二種是應用MATLAB自帶編譯器,将函數編譯成DLL和LIB文件,供VC程序調用。該方法優點是VC程序可以直接調用生成庫文件裡的函數,隻需将VC程序裡的變量轉換成MATLAB函數需要的變量類型即可,而且程序運行效率較好。缺點不便于調試。
1. MATLAB引擎
1.1. 在64位win7操作系統下使用MATLAB2012b引擎的配置
1.1.1添加環境變量
Path變量中添加C:\Program Files\MATLAB\R2012b\bin\win64,如圖1-1到圖1-5所示。注意:添加完之後一定要重啟計算機。
圖1-1 添加環境變量-1
圖1-2 添加環境變量-2
圖1-3 添加環境變量-3
圖1-4 添加環境變量-4
圖1-5 添加環境變量5
1.1.2 X64平台配置
在VS中需要添加MATLAB引擎環境的工程中設置成x64平台。進入“配置管理器”,增加x64平台,如圖1-6到1-8所示。
圖1-6 X64平台配置-1
圖1-7 X64平台配置-2
圖1-8 X64平台配置-3
1.1.3 添加頭文件和庫文件
到項目屬性中的C 目錄中:
包含目錄增加:C:\Program Files\MATLAB\R2012b\extern\include
庫目錄增加:C:\Program Files\MATLAB\R2012b\extern\lib\win64\microsoft
步驟如圖1-9到圖1-13所示。
最後添加上添加使用MATLAB引擎和函數需要的庫文件和頭文件:
#include “mat.h”
#include “engine.h”
#progma comment(lib,”libmx.lib”)
#progma comment(lib,”libmat.lib”)
#progma comment(lib,”libeng.lib”)
如圖1-14所示
圖1-9 添加頭文件和庫文件-1
圖1-10 添加頭文件和庫文件-2
圖1-11 添加頭文件和庫文件-3
圖1-12 添加頭文件和庫文件-4
圖1-13 添加頭文件和庫文件-5
圖1-14 添加頭文件和庫文件-6
1.2. 使用MATLAB引擎VC與MATLAB變量轉換說明
1.2.1 啟動MATLAB引擎
在VC中使用MATLAB引擎首先要啟動MATLAB引擎,代碼如下:
Engine* ep; //定義MATLAB引擎指針。
If (!(ep=engOpen(NULL))) //測試是否啟動MATLAB引擎成功。
{
AfxMessageBox(“Can’t start Matlab engine”);
}
1.2.2 寫MATLAB函數命令
在VC使用MATLAB引擎中,寫MATLAB語句非常簡單,例如寫一句MATLAB語句
“Figure,imshow(I)”,在VC中隻要寫成“engEvalString(ep,”Figure,imshow(I);”);”。
當MATLAB語句較長的時候或者有FOR循環或者IF語句的時候,可以将MATLAB代碼寫在一個engEvalString函數裡,用“\”換行。舉例如下:
MATLAB代碼:
for i=1:5
for j=1:5
I(i,j)=1;
end
end
VC代碼寫成:
engEvalString(ep,”for i=1:5;\
for j=1:5;\
I(i,j)=1;\
end;\
end”);
1.2.3 VC與MATLAB混編舉例
Void Detect(IN BYTE* pHBlob,BYTE* pLBlob,OUT BYTE* pBlob)
{
int iWidth=300;
int iHeight=300;
//定義MATLAB函數要使用的三個變量
mxArray* mxpHBlob=NULL;
mxArray* mxpLBlob=NULL;
mxArray* mxpBlob=NULL;
//給MATLAB輸入兩個變量分配空間
mxpHBlob=mxCreateNumericMatrix(iWidth,iHeight,,mxUINT8_CLASS,mxREAL);
mxpLBlob=mxCreateNumericMatrix(iWidth,iHeight,,mxUINT8_CLASS,mxREAL);
//将VC輸入的變量地址拷貝給MATLAB輸入變量
memcpy((void*)mxGetPr(mxpHBlob),(void*)pHBlob,iWidth*iHeight);
memcpy((void*)mxGetPr(mxpLBlob),(void*)pLBlob,iWidth*iHeight);
//将MATLAB輸入變量傳遞到MATLAB中
engPutVariable(ep,”HBlob”,mxpHBlob);
engPutVariable(ep,”LBlob”,mxpLBlob);
//執行MATLAB函數
engEvalString(ep,”Blob=ImgRestruction(HBlob,LBlob);”);
//獲得MATLAB函數輸出變量
mxpBlob=engGetVariable(ep,”Blob”);
//将将MATLAB函數輸出變量傳遞給VC函數輸出變量
memcpy((void*)pBlob,(void*)mxGetPr(mxpBlob),iWidth*iHeight);
//銷毀MATLAB變量矩陣空間
mxDestroyArray(mxpHBlob);
mxDestroyArray(mxpLBlob);
mxDestroyArray(mxpBlob);
return;
}
注意:自己寫的MATLAB函數一定要放在..\R2012b\bin的目錄下。
2. Matlab生成動态庫
2.1. MATLAB生成動态庫步驟
點擊MATLAB Compiler,提示如圖2-1所示,新輸入一個工程名,類型選擇C 共享庫。第一次使用matlab生成動态庫要安裝編譯器,如圖2-2所示,在matlab中的Common Window窗口中輸入mbuild –setup,然後提示選擇一個編譯器,依據自己需要選擇,在項目裡我們選擇2。然後再MATLAB右端Build選項裡點擊Add files,選擇需要編譯的m文件,點擊按鈕進行編譯,如圖2-3、2-4所示。最後會在..My Document\Matlab\文件夾下生成一個m文件的文件夾,将其中生成的.lib、.dll、.h文件(如圖2-5所示)拷貝到需要調用MATLAB動态庫函數的VC工程目錄下,即完成Matlab生成動态庫的步驟。
圖2-1 MATLAB生成動态庫-1
圖2-2 MATLAB生成動态庫-2
圖2-3 MATLAB生成動态庫-3
圖2-4 MATLAB生成動态庫-4
圖2-5 MATLAB生成動态庫-5
2.2. VC與MATLAB生成動态庫函數混編方法
2.2.1 使用MATLAB生成動态庫的配置
首先安裝matlab運行時,在matlab的command window中輸入mcrinstaller即可找到MCR的位置,點擊安裝即可。
在VC 目錄下包含目錄增加:C:\Program Files\MATLAB\R2012b\extern\include,
C:\Program Files\MATLAB\R2012b\extern\include\win64
庫目錄增加:C:\Program Files\MATLAB\R2012b\extern\lib\win64\microsoft(如圖2-6到2-8所示)
圖2-6 使用MATLAB生成動态庫配置-1
圖2-7 使用MATLAB生成動态庫配置-2
圖2-8 使用MATLAB生成動态庫配置-3
在鍊接器中輸入添加附加依賴項mclmcrrt.lib mclmcr.lib Reconstruction.lib
預編譯頭stdafx.h中加入
#include ” mclmcrrt.h”
#include “mclcppclass.h”
#include “Reconstruction.h”頭文件
然後初始化應用,初始化庫函數(例如庫文件名稱為Restruction),代碼如下:
If(!mclInitializeApplication(NULL,0))
{
AfxMessage(“Could not initialize the application!”);
}
If(!lRestructionInitialize())
{
AfxMessage(“Could not initialize the Restruction!”);
}
2.2.2 在沒有安裝MATLAB機器上的配置
由于MATLAB過于龐大,且安裝費時,占用内存,所以一般不用在機器上安裝整個MATLAB客戶端,隻需要安裝MCR就能用VC調用MATLAB生成的動态庫。安裝方法見2.2.1。
在VC 目錄下包含目錄增加:
C:\Program Files\MATLAB\MATLAB Compiler Runtime\v80\extern\include
C:\Program Files\MATLAB\ MATLAB Compiler Runtime\v80\extern\include\win64
庫目錄增加:
C:\Program Files\MATLAB\ MATLAB Compiler Runtime\v80\\extern\lib\win64\microsoft
其他的配置見2.2.1。
2.2.3 VC MATLAB混編舉例
例1
void Function(IN BYTE* pHBlob,BYTE* pLBlob,OUT BYTE* pBlob)
{
int iWid=300;
int iHei=300;
//定義MATLAB函數要使用的變量
mwArray* mwpHBlob;
mwArray* mwpLBlob;
mwArray* mwpBlob;
//為變量分配空間
mwpHBlob=new mwArray(iWid,iHei,mxUINT8_CLASS,mxReal);
mwpLBlob=new mwArray(iWid,iHei,mxUINT8_CLASS,mxReal);
mwpBlob=new mwArray(iWid,iHei,mxUINT8_CLASS,mxReal);
//将VC輸入變量的值傳給MATLAB輸入變量
mwpHBlob.SetData(pHBlob,iWid*iHei);
mwpLBlob.SetData(pLBlob,iWid*iHei);
//執行MATLAB函數,函數第一個參數為輸出變量值的個數
Reconstrction(1, mwpBlob, mwpHBlob, mwpLBlob);
//将MATLAB輸出變量值傳遞給VC函數輸出變量值
mwpBlob.GetData(pHBlob,iWid*iHei);
//銷毀内存
delete mwpHBlob;
delete mwpLBlob;
delete mwpBlob;
return;
}
例2
CString strFrontPath=CString(“F:\\正面訓練數據路徑\\”);
mwArray * G_MWTrainDataFrontPath;
mwArray * G_MWRefGridDataFront;
mwArray * G_MWSubFrontRefImg;
G_MWTrainDataFrontPath=new mwArray(strFrontPath);
const char* fields[]={"V","meanV"};
G_MWRefGridDataFront=new mwArray(10,20,2,fields);
G_MWSubFrontRefImg=new mwArray(1000,2000,mxUINT8_CLASS,mxREAL);
mwArray V1(30000,50,mxDOUBLE_CLASS);
mwArray meanV1(1,30000,mxDOUBLE_CLASS);
for (int i=1;i<=10;i )
{
for (int j=1;j<=20;j )
{
(*G_MWRefGridDataFront)(fields[0],i,j)=V1;
(*G_MWRefGridDataFront)(fields[1],i,j)=meanV1;
}
}
loadMat(2,*G_MWRefGridDataFront,*G_MWSubFrontRefImg,*G_MWTrainDataFrontPath);
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!