windows系統(tǒng)下C++調(diào)用matlab程序的方法詳解
前言
之前已經(jīng)跟大家介紹了在ubuntu系統(tǒng)下C++調(diào)用matlab程序的方法,需要的朋友們可以參考這篇文章,本文將給大家介紹關(guān)于windows下C++調(diào)用matlab程序的相關(guān)內(nèi)容,分享出來供大家參考學(xué)習(xí),下面話不多說了,來一起看看詳細(xì)的介紹吧。
實(shí)驗(yàn)平臺(tái):
matlab R2016b VS2013
思路:
1. 設(shè)置matlab的編譯器,使用外部的VC或者gcc等編譯器。
2. 編譯m文件成dll
3. 設(shè)置VS的Include路徑和lib鏈接庫的路徑
4. 編寫C++調(diào)用dll
步驟:
1. 設(shè)置matlab的編譯器
在命令行窗口下,輸入并執(zhí)行如下命令:mex –setup
在出現(xiàn)的編譯器中,選擇VS2013
然后在輸入命令:mbuild –setup
同樣選擇VS2013
2. 編寫.m文件
如下函數(shù)時(shí)完成圖像的分割功能,第一個(gè)參數(shù)是圖像的文件名(路徑),第二個(gè)參數(shù)是分割圖像閾值的大小;完成分割后,將圖像保存為result.bmp;返回值則是原圖像的數(shù)據(jù);
function imagedata=improcess(filename,threshold); imagedata=double(imread(filename)); newbuf=imagedata; [M N]=size(imagedata); for i=1:1:M for j=1:1:N if imagedata(i,j)>threshold newbuf(i,j)=255; else newbuf(i,j)=0; end end end imwrite(uint8(newbuf),'result.bmp'); return;
3. 編譯.m文件
mcc -W cpplib:pr_lib -T link:lib improcess.m
解釋:其中-W是控制編譯之后的封裝格式;
cpplib,是指編譯成C++的lib;
cpplib冒號(hào)后面是指編譯的庫的名字;
-T表示目標(biāo),link:lib表示要連接到一個(gè)庫文件的目標(biāo),目標(biāo)的名字即是.m函數(shù)的名字。
編譯完成之后,pr_lib.h pr_lib.libpr_lib.dll這三個(gè)文件時(shí)我們?cè)赾++中調(diào)用所需要的;這三個(gè)文件和我們用c++編寫dll時(shí),生成的三個(gè)文件時(shí)對(duì)應(yīng)的;
VS中的調(diào)用步驟
1. 設(shè)置VC環(huán)境
將matlab的頭文件路徑和對(duì)應(yīng)的庫文件路徑包含到VS;在VS中,點(diǎn)項(xiàng)目屬性然后在‘VC++目錄目錄'選項(xiàng)卡中,將包含目錄的最后一行,添加matlab相關(guān)的頭文件;如我的matlab對(duì)應(yīng)的路徑為:
........\MATLAB\R2016b\extern\include
........\MATLAB\R2016b\extern\include\win64
將庫目錄,將matlab相關(guān)的靜態(tài)鏈接庫的路徑加入其中:
........\MATLAB\R2016b\extern\lib\win32\microsoft
將鏈接器->輸入:
libeng.lib libmat.lib libmex.lib mclmcrrt.lib pr_lib.lib
2. 新建一個(gè)基于控制臺(tái)的hello World程序;
2.1 添加必須的頭文件和必須的靜態(tài)鏈接庫
如果在上面的鏈接庫中添加了lib, 下面只需要加入頭文件就可以了。
#pragma comment(lib,"mclmcrrt.lib") #pragma comment(lib,"libmx.lib") #pragma comment(lib,"libmat.lib") #include "matrix.h" #include "stdafx.h" #include <iostream> #include "pr_lib.h"
2.2 將matlab編譯生成的pr_lib.h pr_lib.libpr_lib.dll文件拷貝到工程目錄下;并將頭問價(jià)和靜態(tài)鏈接庫添加到工程中:
#pragma comment(lib,"pr_lib.lib") #include "pr_lib.h"
2.3 編輯main函數(shù),調(diào)用improcess函數(shù);
int main(int argc, char* argv[]) { //初始化, 在C++調(diào)用matlab時(shí),必須要進(jìn)行初始化。 if( !pr_libInitialize()) { printf("Could not initialize !"); return -1; } char f_name[10]="lenna.pgm"; //必須將lenna.pgm圖像,拷貝到工程目錄下 mwArray file_name(f_name);//'lenna.pgm' mwArray m_threshold(1,1, mxDOUBLE_CLASS); m_threshold(1,1)=128;//閾值為128 mwArray ImageData(512,512, mxDOUBLE_CLASS); improcess(1,ImageData,file_name,m_threshold); //1,表示返回值的個(gè)數(shù),ImageData用于接收返回值 printf("\n圖像處理結(jié)束,已經(jīng)圖像以閾值128分割開!\n"); double *resultdata=new double[512*512]; ImageData.GetData(resultdata,512*512); printf("\n已獲得圖像數(shù)據(jù)...\n"); for(int i=0;i<512;i++) { for(int j=0;j<512;j++) { printf("%0.1f ",resultdata[512*i+j]); } printf("\n"); } delete []resultdata; // 后面是一些終止調(diào)用的程序 // terminate the lib pr_libTerminate(); return 0; }
解析:從上面的程序我們可以看出,c++與matlab函數(shù)數(shù)據(jù)傳遞是借助matlab定義的mwArray類完成的!該類支持的數(shù)據(jù)類型有:
/*typedef enum { mxUNKNOWN_CLASS = 0, mxCELL_CLASS, mxSTRUCT_CLASS, mxLOGICAL_CLASS, mxCHAR_CLASS, mxVOID_CLASS, mxDOUBLE_CLASS, mxSINGLE_CLASS, mxINT8_CLASS, mxUINT8_CLASS, mxINT16_CLASS, mxUINT16_CLASS, mxINT32_CLASS, mxUINT32_CLASS, mxINT64_CLASS, mxUINT64_CLASS, mxFUNCTION_CLASS, mxOPAQUE_CLASS, mxOBJECT_CLASS}*/
同時(shí)我們應(yīng)注意:mwArray類定義的對(duì)象數(shù)組,其坐標(biāo)仍然是從1開始,而不是像c++那樣,從0開始!mwArray的更詳細(xì)的用法,可以參看mclcomclass.h
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對(duì)我們的支持。
上一篇:C++ STL入門教程(3) deque雙向隊(duì)列使用方法
欄 目:C語言
下一篇:C語言數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)銀行模擬
本文標(biāo)題:windows系統(tǒng)下C++調(diào)用matlab程序的方法詳解
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/1235.html
您可能感興趣的文章
- 01-10大數(shù)(高精度數(shù))模板(分享)
- 01-10深入解析Linux下\r\n的問題
- 01-10Linux C 獲取進(jìn)程退出值的實(shí)現(xiàn)代碼
- 01-10解析Linux下的時(shí)間函數(shù):設(shè)置以及獲取時(shí)間的方法
- 01-10深入探討linux下進(jìn)程的最大線程數(shù)、進(jìn)程最大數(shù)、進(jìn)程打開的文
- 01-10基于linux下獲取時(shí)間函數(shù)的詳解
- 01-10深入sizeof的使用詳解
- 01-10Linux下semop等待信號(hào)時(shí)出現(xiàn)Interrupted System Call錯(cuò)誤(EINTR)解決方法
- 01-10基于Linux系統(tǒng)調(diào)用--getrlimit()與setrlimit()函數(shù)的方法
- 01-10深入解析C中的數(shù)值與真假


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對(duì)數(shù)函數(shù)的表達(dá)式 c語言中對(duì)
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機(jī)閱讀
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-10delphi制作wav文件的方法
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
- 01-10C#中split用法實(shí)例總結(jié)
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 04-02jquery與jsp,用jquery
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 08-05織夢dedecms什么時(shí)候用欄目交叉功能?
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文