windows下C++如何呼叫matlab程式
matlab R2016b VS2013
1. 設定matlab的編譯器,使用外部的VC或者gcc等編譯器。
2. 編譯m檔案成dll
3. 設定VS的Include路徑和lib連結庫的路徑
4. 編寫C++呼叫dll
步驟:
1. 設定matlab的編譯器在命令列視窗下,輸入並執行如下命令:mex –setup
在出現的編譯器中,選擇VS2013
然後在輸入命令:mbuild –setup 同樣選擇VS2013
2. 編寫.m檔案
如下函式時完成影像的分割功能,第一個引數是影像的檔名(路徑),第二個引數是分割影像閾值的大小;完成分割後,將影像儲存為result.bmp;返回值則是原影像的資料;
- 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;
mcc -W cpplib:pr_lib -T link:lib improcess.m
解釋:其中-W是控制編譯之後的封裝格式;
cpplib,是指編譯成C++的lib;
cpplib冒號後面是指編譯的庫的名字;
-T表示目標,link:lib表示要連線到一個庫檔案的目標,目標的名字即是.m函式的名字。
編譯完成之後,pr_lib.h pr_lib.libpr_lib.dll這三個檔案時我們在c++中呼叫所需要的;這三個檔案和我們用c++編寫dll時,生成的三個檔案時對應的;
VS中的呼叫步驟
1. 設定VC環境將matlab的標頭檔案路徑和對應的庫檔案路徑包含到VS;在VS中,點專案屬性然後在‘VC++目錄目錄’選項卡中,將包含目錄的最後一行,新增matlab相關的標頭檔案;如我的matlab對應的路徑為:
........\MATLAB\R2016b\extern\include
........\MATLAB\R2016b\extern\include\win64
........\MATLAB\R2016b\extern\lib\win32\microsoft
將連結器->輸入:
libeng.lib
libmat.lib
libmex.lib
mclmcrrt.lib
pr_lib.lib
2.1 新增必須的標頭檔案和必須的靜態連結庫
如果在上面的連結庫中新增了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檔案拷貝到工程目錄下;並將頭問價和靜態連結庫新增到工程中:
#pragma comment(lib,"pr_lib.lib")
#include "pr_lib.h"
2.3 編輯main函式,呼叫improcess函式;
int main(int argc, char* argv[])
{
//初始化, 在C++呼叫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,表示返回值的個數,ImageData用於接收返回值
printf("\n影像處理結束,已經影像以閾值128分割開!\n");
double *resultdata=new double[512*512];
ImageData.GetData(resultdata,512*512);
printf("\n已獲得影像資料...\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;
// 後面是一些終止呼叫的程式
// terminate the lib
pr_libTerminate();
return 0;
}
解析:從上面的程式我們可以看出,c++與matlab函式資料傳遞是藉助matlab定義的mwArray類完成的!該類支援的資料型別有:
/*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}*/
同時我們應注意:mwArray類定義的物件陣列,其座標仍然是從1開始,而不是像c++那樣,從0開始!mwArray的更詳細的用法,可以參看mclcomclass.h
相關文章
- Windows 下 c++ 呼叫 Rust 庫的例子WindowsC++Rust
- windows命令列下如何呼叫main函式Windows命令列AI函式
- C/C++呼叫Windows DOS命令C++Windows
- matlab-emacs執行matlab程式出錯.不能呼叫matlab命令列模式MatlabMac命令列模式
- python呼叫matlab程式,MATLAB 指令碼打包為 exe可執行程式PythonMatlab指令碼行程
- Windows上Python使用swig呼叫C++WindowsPythonC++
- python呼叫matlabPythonMatlab
- matlab呼叫pythonMatlabPython
- windows 下c++編譯WindowsC++編譯
- 從 C/C++ 程式呼叫 Java 程式碼C++Java
- 如何檢視windows下的Oracle程式WindowsOracle
- C++如何解析函式呼叫C++函式
- banq請問如何用java程式呼叫windows的執行命令JavaWindows
- Windows下編譯Caffe並編譯Matlab介面Windows編譯Matlab
- C/C++與Matlab混合程式設計初探C++Matlab程式設計
- windows下如何使用QT編寫dll程式WindowsQT
- linux下qt用c++呼叫pythonLinuxQTC++Python
- windows下 power shell啟動,呼叫ssh命令Windows
- android使用JNI呼叫C,C++程式AndroidC++
- Matlab中@與函式呼叫Matlab函式
- 【原創】Matlab.NET混合程式設計技巧之直接呼叫Matlab內建函式Matlab程式設計函式
- Linux下跨語言呼叫C++實踐LinuxC++
- c/c++、matlab讀取資料夾下的檔案C++Matlab
- java呼叫bat&監控windows下的某一程式是否關閉JavaBATWindows
- C++呼叫LuaC++
- android層java如何呼叫cocos2dx c++程式碼 步驟AndroidJavaC++
- (轉)Linux下 C++呼叫C 實現socket網路通訊程式設計LinuxC++程式設計
- VS08下C++程式碼如何顯示行號C++
- 影象放大並進行BiCubic插值 Matlab/C++程式碼MatlabC++
- 【混合程式設計】C/C++呼叫Fortran的DLL程式設計C++
- Windows 程式設計簡介從C/C++到Windows程式設計Windows程式設計C++
- Windows下kill oracle程式WindowsOracle
- Matlab以MEX方式呼叫C原始碼Matlab原始碼
- 如何在matlab程式碼中加一層分隔?Matlab
- C++呼叫C介面C++
- C++呼叫CMD命令C++
- 以下為Windows NT 下的32 位C++程式,請計算sizeof 的值WindowsC++
- javascript如何呼叫本地應用程式JavaScript