tft每日頭條

 > 生活

 > 如何在matlab裡面調用c語言的函數

如何在matlab裡面調用c語言的函數

生活 更新时间:2024-12-25 13:48:49

如何在matlab裡面調用c語言的函數?Matlab調用C語言函數如果我有一個用C語言寫的函數,實現了一個功能,如一個簡單的函數:,今天小編就來聊一聊關于如何在matlab裡面調用c語言的函數?接下來我們就一起去研究一下吧!

如何在matlab裡面調用c語言的函數(轉發Matlab調用C語言函數)1

如何在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語言實現,以提高計算速度。

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关生活资讯推荐

热门生活资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved