MATLAB - VS2017 的MEX開發


寫在前面

  • 關於mex, mex類似於DLL,所以可以用C, C++等語言編寫,同樣的在MATLAB上也可以生成。

  • 在MATLAB上編寫MEX適用於那些已經完成了單步調試后的C函數模塊,因為MATLAB無法對MEX的源文件也就是C函數進行調試,只會在編譯的時候對一些語法錯誤進行檢查,但是對於諸如數組越界之類的內存泄漏問題,MATLAB則無法進行檢查。出現這類問題基本就是強退。因此,最好將C函數模塊在VS下調試完成后再利用MATLAB進行后續結果分析,特別是涉及到一些數據處理,比如作圖,擬合之類

  • 利用VS完成MEX的編寫,需要進行一些配置,比如添加頭文件,相關的依賴項等。

利用MATLAB編寫MEX

1.編譯環境設置,選擇需要的C/C++編譯器

mex -setup

2.編寫MEX

#include "mex.h"
void mexFunction(
        int nlhs,
        mxArray *plhs[],
        int nrhs,
        const mxArray *prhs[]){
            
        }

在mexFunction函數中,會涉及到輸入數據的操作,利用mxGetPr得到數據的指針地址。mxGetM和mxGetN會返回矩陣的行和列(整數)。另外MATLAB的矩陣存儲順序是“從上到下,從左到右”。即A(i,j) = (M + m(j-1) +(i-1))

關於輸出數據的操作,主要包括對輸出數據分配內存空間,即

plhs[0]=mxCreateDoubleMatrix(m, n, mxREAL); //生成一個mxn的實矩陣

和輸入數據一樣,同樣需要一個指向數據的指針變量

double *a;
A = mxGetPr(plhs[0];

下面給出了一個簡單的例子,函數返回兩個數的和。


#include "mex.h"

double testAdd(double x, double y){
    return x + y;
}

void mexFunction(
    int nlhs,
    mxArray *plhs[],
    int nrhs,
    const mxArray *prhs[]){
    double *a;
    double b,c;
    plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL);
    a = mxGetPr(plhs[0]);
    b = *(mxGetPr(prhs[0]));
    c = *(mxGetPr(prhs[1]));
    *a = testAdd(b,c);
}

利用VS編寫MEX

1.打開VS,新建項目,選擇MFC DLL

2.配置項目屬性

  • C/C++ -> Additional Include Dirrctories 包含目錄, 添加MATLAB安裝目錄下的\extern\include路徑
  • Linker -> General -> Additional Library Directories 庫目錄, 添加MATLAB安裝路徑下的\extern\lib\win64\microsoft
  • Linker -> Input -> Additional Dependencies 附加依賴項,添加libmx.lib;libmex.lib;libmat.lib;

3.創建編輯輸出函數
在源文件的路徑下新建.def的文件,在文件內寫入

EXPORTS mexFunction

在項目屬性頁的Linker->Input->Module Definition File內加入創建的***.def文件。

另外,更改Configuration Properties->General->Target Extension內容.mexw64

4.編寫MEX文件
MEX文件編寫要求與MATLAB內的一致。

5.VS編譯MEX
編寫完成后進行BUILD,沒有錯誤在源碼上一級的x64文件夾中的Debugw中會生成MATALB MEX類型的輸出文件,可以在MATLAB環境下進行驗證。


reference:
https://www.cnblogs.com/arxive/p/4687766.html
https://blog.csdn.net/bensnake/article/details/78832169


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM