matlab如何調用C函數(轉載)

matlab如何調用C函數
若是我有一個用C語言寫的函數,實現了一個功能,如一個簡單的函數:
double add(double x, double y) {
return x + y;
}
如今我想要在Matlab中使用它,好比輸入:
>> a = add(1.1, 2.2)
3.3000
要得出以上的結果,那應該怎樣作呢?
解決方法之一是要經過使用MEX文件,MEX文件使得調用C函數和調用Matlab的內置函數同樣方便。MEX文件是由原C代碼加上MEX文件專用的接口 函數後編譯而成的。
能夠這樣理解,MEX文件實現了一種接口,它把在Matlab中調用函數時輸入的自變量經過特定的接口調入了C函數,得出的結果再經過該接口調回 Matlab。該特定接口的操做,包含在mexFunction這個函數中,由使用者具體設定。
因此如今咱們要寫一個包含add和mexFunction的C文件,Matlab調用函數,把函數中的自變量(如上例中的1.1和2.2)傳給 mexFunction的一個參數,mexFunction把該值傳給add,把得出的結果傳回給mexFunction的另外一個參數,Matlab經過 該參數來給出在Matlab語句中調用函數時的輸出值(如上例中的a)。
好比該C文件已寫好,名爲add.c。那麼在Matlab中,輸入:
>> mex add.c
就能把add.c編譯爲MEX文件(編譯器的設置使用指令mex -setup),在Windows中,MEX文件類型爲mexw32,即如今咱們得出add.mexw32文件。如今,咱們就能夠像調用M函數那樣調用 MEX文件,如上面說到的例子。因此,經過MEX文件,使用C函數就和使用M函數是同樣的了。
咱們如今來講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類型 的指針數組。
完整的add.c以下:
// add.c
#include "mex.h" // 使用MEX文件必須包含的頭文件
// 執行具體工做的C函數
double add(double x, double y) {
return x + y;
}// MEX文件接口函數
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 = add(b, c);
}mexFunction的內容是什麼意思呢?咱們知道,若是這樣調用函數時:
>> output = add(1.1, 2.2);
在未涉及具體的計算時,output的值是未知的,是未賦值的。因此在具體的程序中,咱們創建一個1x1的實double矩陣(使用 mxCreateDoubleMatrix函數,其返回指向剛創建的mxArray的指針),而後令plhs[0]指向它。接着令指針a指向 plhs[0]所指向的mxArray的第一個元素(使用mxGetPr函數,返回指向mxArray的首元素的指針)。一樣地,咱們把prhs[0]和 prhs[1]所指向的元素(即1.1和2.2)取出來賦給b和c。因而咱們能夠把b和c做自變量傳給函數add,得出給果賦給指針a所指向的 mxArray中的元素。由於a是指向plhs[0]所指向的mxArray的元素,因此最後做輸出時,plhs[0]所指向的mxArray賦值給 output,則output即是已計算好的結果了。
上面說的一大堆指向這指向那,什麼mxArray,初學者確定都會被弄到頭暈眼花了。很抱歉,要搞清楚這些亂糟糟的關係,只有多看多練。
實際上mexFunction是沒有這麼簡單的,咱們要對用戶的輸入自變量的個數和類型進行測試,以確保
輸入正確。如在add函數的例子中,用戶輸入char array即是一種錯誤了。
從上面的講述中咱們總結出,MEX文件實現了一種接口,把C語言中的計算結果適當地返回給Matlab罷了。當咱們已經有用C編寫的大型程序時,大可沒必要 在Matlab裏重寫,只寫個接口,作成MEX文件就成了。另外,在Matlab程序中的部份計算瓶頸(如循環),可經過MEX文件用C語言實現,以提升 計算速度。ide

相關文章
相關標籤/搜索