**:
如果我有乙個用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...