在Visual Studio中開發Matlab mex檔案,產生mexw64/mexw32

來源:互聯網
上載者:User

標籤:

csunking貢獻,2015-9-22 1712

1、   概述

通過使用C/C++與Matlab混合編程,既可以享受到C代碼快速執行的速度,又可以方便的使用Matlab眾多的庫函數和強大的繪圖功能。讓Matlab調用C函數是通過DLL檔案實現的,而這個DLL的開發過程不僅僅可以使用Matlab內建的mex命令,還可以使用VC++開發環境,使用VC有很多好處,一是讓我回到了原來熟悉的開發環境中,二能夠使用更加標準的C++編譯器,第三點也是最爽的,可以使用VC強大的調試功能。

 

此次文檔更新時使用的開發環境為:Visual Studio 2012, Matlab R2015a

 

2、   步驟

1.啟動VS,建立一個空的項目ATSRID。然後設定項目屬性資訊。然後,建立一個.cpp檔案atsrid.cpp。並在添加Preprocessor Definitions中添加MATLAB_MEX_FILE的宏定義。

                

將輸出檔案的尾碼名改為mexw64/mexw32

$(OutDir)$(TargetName).mexw64

 

設定項目產生程式的平台位元屬性

2. 為matlab函數提供標頭檔和靜態庫的支援

包含目錄:

E:\Program Files\MATLAB\R2015a\extern\include

E:\Program Files\MATLAB\R2015a\extern\include\win64

庫目錄

E:\Program Files\MATLAB\R2015a\extern\lib\win64\microsoft

連接器中添加靜態連結庫檔案

libmx.lib;libmat.lib;libmex.lib;

 

3. 在atsrid.cpp中編寫mex檔案中的內容。然後用利用.def檔案匯出mexFunction函數。

#include "mex.h"void mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[]){    int nlhs1,nrhs1;    mxArray *plhs1[1],*prhs1[1];    mxArray *array_ptr;     nlhs1=1;    nrhs1=1;    if((array_ptr=mexGetVariable("base","x"))==NULL)   //"base" means the command window where    {                                                   //we get the matrix "x".        mexErrMsgTxt("Variable ‘x‘ not in the workspace.");    }    else    {        prhs1[0]=array_ptr;        mexCallMATLAB(nlhs1,plhs1,nrhs1,prhs1,"det");        mexPrintf("Det(array_ptr) == %g\n",mxGetScalar(plhs1[0]));    }}

 

 

讓函數從DLL中的匯出有兩種方法,__declspec(dllexport)命令匯出和def檔案匯出,但由於需要匯出mexFunction在”mex.h”中已經定義,所以前一種匯出方法行不通,這裡採用def檔案匯出。

首先告訴編譯器我使用了xx.def檔案,然後再在檔案中加入內容。通過上述方式定義的def檔案會自動添加入下面的屬性中。

 

檔案中的內容如下

LIBRARY ATSRID; 指的是模組名稱(可以用建立的項目名稱)

EXPORTS mexFunction

 

4. 編譯運行,產生ATSRID.mexw64檔案。然後將該檔案拷貝到Matlab的目前的目錄下,然後進行該模組的測試
x=magic(100);

ATSRID();

可以將結果與det(x)得到的相比較,查看是否正確。

 

備忘:在VS項目中的atsrid.cpp可以直接放在matlab的目前的目錄下進行mex atsrid.cpp編譯,也同樣可以產生atsrid.mexw64。之所以在Visual C++中進行編譯,是因為方便調試該程式。下面也將介紹另外一種調試方法。

 

 

3、  採用VS Debug mex檔案

方便對各位在matlab上的researcher or developer。

1、初次使用mex時需要配置配置matlabmex編譯器

mex -setup

2、接下來,用-g選項編譯mex源檔案,-g表示編譯結果中包含調試資訊。

mex -g atsrid.cpp

 

3、開啟Visual Studio,不要關閉你的matlab。在Visual Studio的工具菜單中,選擇關聯到一個進程。

 

Visual Studio會載入資料,在彈出的對話方塊中選擇,選擇matlab進程,點擊“關聯”。

 

4、首先在Visual Studio的ATSRID項目中的atsrid.cpp檔案代碼處添加斷點。然後,開啟matlab 放置atsrid.mexw64的目前的目錄,在程式碼中輸入下面的代碼

x=magic(10);

atsrid();

 

之後,會發現Visual Studio會自動將程式運行到斷點出,等待下一步的操作。

 

當斷點被觸發了,你就可以利用Visual Studio來查看你的變數,記憶體,調試你的程式了。

引用

似水流年,2009,http://knhunter.blogbus.com/.

 

在Visual Studio中開發Matlab mex檔案,產生mexw64/mexw32

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.