matlab呼叫c或c 源程式,能夠標頭檔案和原始檔分開寫

2021-03-25 23:39:52 字數 3370 閱讀 9181

1樓:匿名使用者

我轉過來的

寫的很清楚 你參考下吧,把你的pthis dc等引數對照一下就可以了

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

double add(double x, double 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)

// mex檔案介面函式

void mexfunction(

int nlhs,

mxarray *plhs,

int nrhs,

const mxarray *prhs)

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

2樓:匿名使用者

函式可以包含相同點:

標頭檔案和源**的原始檔,檔案儲存在純文字,寫的c / c + +語言規範,你可以使用型別定義和通常,可變符合定義,宣告和實現可以包含巨集定義,使用相同的呼叫約定。

不同點:

c / c + +編譯器所需的源**檔案中必須包含的功能項,這是主要的功能,或winmain函式。標頭檔案中不能包含函式入口,也就是說,在標頭檔案不能被單獨編譯成一個程式只包含一段程式或只是定義常量,變數。

協會:標標頭檔案是設計的源**,以打**,寫靜態檔案,#include預處理命令直譯器的源**檔案,標頭檔案指令的完整副本的源**,在編譯時,這相當於在源**中插入的函式宣告。

一些標頭檔案包含呼叫資訊的lib檔案包含靜態庫函式呼叫語句,編譯程式靜態連結到某些標頭檔案的目的是為了方便的api呼叫和寫,包含一個動態連結庫呼叫資訊和規格在執行時dll載入至記憶體提取函式執行。

的是,其實,在標頭檔案中的資訊被寫入的源**是完全可以實現相同的功能。如果你想學習寫的標頭檔案,你可以參考標準的c / c + +庫h檔案。

目的:在matlab中呼叫c或c++語言編寫的程式

這段c語言源程式哪裡錯了

指標先指向了陣列首地址,指標加1後指向陣列的下一個元素 即第一個一維陣列的第二個元素 將指標加4 4表示一維陣列的維數 後就指向第二個一維陣列的第一個元素 指標加1表示指向下一個元素 首先p指向的是陣列首地址,即p現在指向的是score 0 0 指標加1以後p指向的是第一個一維陣列的第二個元素,即s...

利用C或C 或Matlab程式設計怎麼繪製常規水庫排程圖

繪製常復 規排程圖的步驟 1 選制典型年 2 逆時序按保證出力圖推算 程式設計實現的話,我沒做過,關鍵是以下兩點 1 根據來水排頻選年 排序 求個經驗頻率就行 2 已知出力的逆時序試算 可以用迭代試算然後再加一下,容錯判斷之類的,就差不多了 順便說一下,這個問題如果放在專業問題裡面,可能會有更多人回...

如何在linu中使用vi來建立c源程式檔案

vi tmp.c 按源i進入插入模式,輸入原始檔內容 include int main int argc,char argv 按esc退出插入模式,輸入 wq回到shell gcc tmp.c a.out 直接baivi 檔名 檔名必須以du.c結尾。然後就zhi會進入vi介面 在這裡編dao 寫程...