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í),下面話不多說了,來一起看看詳細的介紹吧。
實驗平臺:
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ù)是圖像的文件名(路徑),第二個參數(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冒號后面是指編譯的庫的名字;
-T表示目標,link:lib表示要連接到一個庫文件的目標,目標的名字即是.m函數(shù)的名字。
編譯完成之后,pr_lib.h pr_lib.libpr_lib.dll這三個文件時我們在c++中調(diào)用所需要的;這三個文件和我們用c++編寫dll時,生成的三個文件時對應(yīng)的;
VS中的調(diào)用步驟
1. 設(shè)置VC環(huán)境
將matlab的頭文件路徑和對應(yīng)的庫文件路徑包含到VS;在VS中,點項目屬性然后在‘VC++目錄目錄'選項卡中,將包含目錄的最后一行,添加matlab相關(guān)的頭文件;如我的matlab對應(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. 新建一個基于控制臺的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文件拷貝到工程目錄下;并將頭問價和靜態(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時,必須要進行初始化。
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,表示返回值的個數(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}*/
同時我們應(yīng)注意:mwArray類定義的對象數(shù)組,其坐標仍然是從1開始,而不是像c++那樣,從0開始!mwArray的更詳細的用法,可以參看mclcomclass.h
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
- c++網(wǎng)絡(luò)編程下Linux的epoll技術(shù)和Windows下的IOCP模型
- c++下使用windows api遍歷指定文件夾及其子文件夾中的文件
- 解決vscode下調(diào)試c/c++程序一閃而過的問題(Windows)
- visual studio code 配置C++開發(fā)環(huán)境的教程詳解 (windows 開發(fā)環(huán)境)
- Visual Studio Code (vscode) 配置C、C++環(huán)境/編寫運行C、C++的教程詳解(Windows)【真正的小白版】
- C++實現(xiàn)俄羅斯方塊(windows API)
- Windows下使用Dev-C++開發(fā)基于pthread.h的多線程程序?qū)嵗?/a>
- Windows安裝配置C/C++(VS2017)OpenSSL開發(fā)環(huán)境配置教程
- C++模擬鍵盤按鍵的實例
- C++檢測鍵盤某鍵是否按下的方法
- C/C++獲取鍵盤事件的方法
- 淺談C++的幾種從鍵盤輸入方式
- C++鍵盤記錄程序代碼
- C++處理鍵盤輸入的方法
- c++調(diào)用windows鍵盤代碼詳情
相關(guān)文章
QT網(wǎng)絡(luò)編程Tcp下C/S架構(gòu)的即時通信實例
下面小編就為大家?guī)硪黄猀T網(wǎng)絡(luò)編程Tcp下C/S架構(gòu)的即時通信實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-08-08
深入學(xué)習(xí)C++智能指針之shared_ptr與右值引用的方法
智能指針的核心實現(xiàn)技術(shù)是引用計數(shù),每使用它一次,內(nèi)部引用計數(shù)加1,每析構(gòu)一次內(nèi)部的引用計數(shù)減1,減為0時,刪除所指向的堆內(nèi)存,今天通過本文給大家分享C++智能指針之shared_ptr與右值引用的方法,需要的朋友跟隨小編一起看看吧2021-07-07
C語言 while for do while循環(huán)體詳解用法
在不少實際問題中有許多具有規(guī)律性的重復(fù)操作,因此在程序中就需要重復(fù)執(zhí)行某些語句。一組被重復(fù)執(zhí)行的語句稱之為循環(huán)體,能否繼續(xù)重復(fù),決定循環(huán)的終止條件2021-10-10
解決Microsoft?Visual?C++?2010?Express?運行及調(diào)試問題
這篇文章主要介紹了解決Microsoft?Visual?C++?2010?Express?運行及調(diào)試問題,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-01-01
C/C++中數(shù)據(jù)類型轉(zhuǎn)換詳解及其作用介紹
這篇文章主要介紹了C/C++中數(shù)據(jù)類型轉(zhuǎn)換詳解及其作用,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-09-09

