matlab 如何使用mex

2021-08-24 17:54:59 字數 2550 閱讀 2937

matlab與c語言混合程式設計介面

matlab是一種解釋性語言,不需要編譯,除錯比較方便,但是缺點是速度慢。這一點在執行複雜的科學演算法的時候體現極為明顯。而c語言雖然相對比 較複雜,但是執行效率很高,matlab很多內建函式都是用c寫的。另外有時候很多演算法已經已c語言的形式寫好,於是我們會想到是否有方法將c語言**與 matlab連線起來。matlab提供乙個c語言中的mex函式庫,可以實現以上功能。這裡以乙個最簡單的例子來說明。

我們的目標是:用c語言寫乙個加法函式add(),在matlab中輸入c=add(a,b)可以得到a與b的和。

這個示例是否有點白痴?c=a+b不就完了?這裡只是乙個示例而已,把最基本的環節解釋清楚就夠了。

我們要做的是

在matlab當目錄中建立乙個add.c檔案;

用你熟知的c語言寫乙個add()函式;

利用mexfuncion()函式建立c與matlab的介面;

從matlab命令視窗中編譯add.c檔案為mex檔案;

matlab命令視窗中使用add()函式。

建立add.c檔案

這個檔案被稱為source mex-file

在當前資料夾視窗中新建乙個指令碼:右鍵單擊空白處,選擇new file,選擇script

重新命名檔案為add.c

用外部編輯器開啟add.c

編輯add.c檔案

matlab提供乙個函式庫,儲存在mex.h中,所以檔案一開始要將其include:

然後用你熟知的c語言寫乙個函式吧

1 2

3 double add(double x, double y)

這段**被稱作computational routine,就是真正的演算法實現的地方。

然後我們來建立其與matlab的間介面。mex函式庫裡有個mexfunction()函式,它相當於c語言中的main()函式。所以這裡我們知道了mex原始檔沒有main(),而是以乙個mexfunction()代替。

mexfunction的引數是這樣的:

1 2

3 void mexfunction(int nlhs, mxarray *plhs, int nrhs, const mxarray *prhs)

其中nlhs (number of left-hand side) 是輸出引數的個數,nrhs (number of right-hand side) 是輸入引數的個數。例如對於c=add(a,b),有 nlhs=1,hrhs=2。

plhs與prhs都是指標陣列,也就是說它是個陣列,每個元素都是乙個指標,這些指標指向的東東的型別是mxarray。那什麼是mxarray呢?可以把他理解matlab中的矩陣,因為matlab中所有資料都是以矩陣的形式儲存的。

先講prhs,就是輸入的引數,prhs[0]指向a,prhs[1]指向b,但是注意不能用*(prhs[0])得到a的值。因為 prhs[0]指向的東西的型別是mxarray(引數列表裡看出),想把它的值以我們常用的數值形式賦給乙個標量(scalar),得使用 mxgetscalar()函式轉化一下:

1 2

3 double a, b;

a = mxgetscalar(prhs[0]);

b = mxgetscalar(prhs[1]);

plhs對應的輸出的內容。plhs[0]這個指標指向輸出的第乙個引數,就是c=add(a, b)中的c了。記住這個c應該是以mxarray的型別出現的,為了得到mxarray型別的輸出量,要使用 mxcreatedoublematrix()函式,它建立乙個指向mxarray型別的指標。

1 plhs[0] = mxcreatedoublematrix(1, 1, mxreal);

引數(1, 1, mxreal)定義了對應c的尺寸型別,matlab中c是以1×1的實數矩陣形式報儲存的。

而使用mxgetpr()函式可以得到plhs[0]指向的mxarray的第乙個double型別的指標。

1 2

double *c;

c = mxgetpr(plhs[0]);

最後呼叫add()函式

1 *c=add(a,b);

完整**如下:

1 2

3 4

5 6

7 8

9 10

11 12

13 14

15 16

17 18

double add(double x, double y)

void mexfunction(int nlhs, mxarray *plhs, int nrhs, const mxarray *prhs)

編譯add.c檔案為mex檔案

在matlab命令視窗中輸入

1 mex add.c

回車後matlab會呼叫編譯器把源程式編譯成為mex檔案。

注意如果是在mac os x下提示gcc 4.0 command not found之類的錯誤資訊,則需要安裝xcode。

執行c=add(a,b)

在matlab命令視窗中輸入

1 c=add(1, 2)

回車後可以得到結果。

MATLAB錯誤 使用 mex 未找到支援的編譯器

解決matlab2020a安裝完 mingw w64 c c compiler 執行 mex setup 後找不編譯器的問題。setenv mw mingw64 loc c tdm gcc 64 mex setup getenv mw mingw64 loc ans c programdata ma...

Matlab與C 混合MEX程式設計

一 mexfunction 與c中的main函式一樣,mex程式中的開始函式為mexfunction.預設變數引數是 void mexfunction int nlhs,mxarray plhs,int nrhs,const mxarray prhs 其中nlhs指的是在呼叫函式時返回值的個數 pl...

MATLAB編譯C 問題(MEX檔案)

由於作業原因,需要matlab和c 聯合程式設計,matlab編譯c 檔案遇到一系列問題,現在彙總如下 首先關於大部分基礎知識,參閱這篇文章 matlab與c c 聯合程式設計之從matlab呼叫c c 執行mex setup後,matlab顯示如下 由於我使用的是matlab 2013a vs20...