基於MEX檔案的Matlab與C語言介面例項

2021-07-01 22:55:38 字數 1851 閱讀 1313

**:

如果我有乙個用c語言寫的函式,實現了乙個功能,如乙個簡單的函式:

double add(double x, double y)

現在我想要在matlab中使用它,比如輸入:

>> a = add(1.1, 2.2)

3.3000

可以通過mex作為與c語言的介面來實現。mex是一種動態連線子程式,可以用c語言編寫。在windows系統下字尾名為dll。

現在我們要寫乙個包含add和mexfunction的c檔案,matlab呼叫函式,把函式中的自變數傳給 mexfunction的乙個引數,mexfunction把該值傳給add,把得出的結果傳回給mexfunction的另乙個引數,matlab通過該引數來給出在matlab語句中呼叫函式時的輸出值。

完整的c程式如下:

#include "mex.h" // 使用mex檔案必須包含的標頭檔案

// 執行具體工作的c函式

double add(double x, double y)

// mex檔案介面函式

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

我們現在來說mexfunction怎樣寫。 

mexfunction的定義為: 

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

可以看到,mexfunction是沒返回值的,它不是通過返回值把結果傳回matlab的,而是通過對引數plhs的賦值。mexfunction的四個引數皆是說明matlab呼叫mex檔案時的具體資訊,如這樣呼叫函式時: 

>> b = 1.1; c = 2.2;

>> a = add(b, c) 

mexfunction四個引數的意思為: 

nlhs = 1,說明呼叫語句左手面(lhs-left hand side)有乙個變數,即a。

nrhs = 2,說明呼叫語句右手面(rhs-right hand side)有兩個自變數,即b和c。

plhs是乙個陣列,其內容為指標,該指標指向資料型別mxarray。因為現在左手面只有乙個變數,即該陣列只有乙個指標,plhs[0]指向的結果會賦值給a。

prhs和plhs類似,因為右手面有兩個自變數,即該陣列有兩個指標,prhs[0]指向了b,prhs[1]指向了c。要注意prhs是const的指標陣列,即不能改變其指向內容。 

因為matlab最基本的單元為array,無論是什麼型別也好,如有double array、 cell array、 struct array……所以a,b,c都是array,b = 1.1便是乙個1x1的double array。而在c語言中,matlab的array使用mxarray型別來表示。所以就不難明白為什麼plhs和prhs都是指向mxarray型別的指標陣列。

下面詳細介紹如何用c語言編寫mex檔案:

2 編譯器的安裝與配置

如:>> mex add.cpp

注意輸入程式名的時候,需要在程式所在的當前路徑下,否則會出現

d:\matlab7\bin\win32\mex.pl: error: 'add.c' not found. 

??? error using ==> mex

unable to complete successfully

mex add.cpp順利執行後會產生相應的add.dll檔案,此時則可在matlab下執行add程式。

輸入及執行結果:

>> b=1;c=2;

>> a=add(b,c)

a =3

或》 a=add(3,4)

a =7

MATLAB中MEX檔案的編寫與除錯

學習與示例 附博文 1.mex的編寫格式 寫mex程式其實就是寫乙個dll程式,所以你可以使用c,c fortran等多種程式語言來寫。編寫mex程式的編輯器可以使用matlab的 編輯器,也可使用自己的c 編輯器,如vs2008等。用matlab的編輯器的好處是,mex函式會加粗高亮顯示,這給程式...

VC 編譯 MATLAB 的 mex 檔案

vc 編譯 matlab 的 mex 檔案 mex 檔案是 matlab 呼叫其他程式語言程式或演算法的介面。在 windows 環境中,mex 檔案是擴充套件檔名為 dll 的動態鏈結庫,可以在 m 程式中直接呼叫,使用者可以通過 234 matlab 實用教程 matlab 提供的命令 mex ...

MATLAB編譯C 問題(MEX檔案)

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