日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > 循环神经网络 >内容正文

循环神经网络

matlab调c

發(fā)布時間:2025/3/15 循环神经网络 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 matlab调c 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
如果我有一個用C語言寫的函數(shù),實現(xiàn)了一個功能,如一個簡單的函數(shù): double add(double x, double y) {return x + y; } 現(xiàn)在我想要在Matlab中使用它,比如輸入: >> a = add(1.1, 2.2)3.3000 要得出以上的結果,那應該怎樣做呢? 解決方法之一是要通過使用MEX文件,MEX文件使得調用C函數(shù)和調用Matlab的內置函數(shù)一樣方便。MEX文件是由原C代碼加上MEX文件專用的接口函數(shù)后編譯而成的。 可以這樣理解,MEX文件實現(xiàn)了一種接口,它把在Matlab中調用函數(shù)時輸入的自變量通過特定的接口調入了C函數(shù),得出的結果再通過該接口調回Matlab。該特定接口的操作,包含在mexFunction這個函數(shù)中,由使用者具體設定。 所以現(xiàn)在我們要寫一個包含add和mexFunction的C文件,Matlab調用函數(shù),把函數(shù)中的自變量(如上例中的1.1和2.2)傳給mexFunction的一個參數(shù),mexFunction把該值傳給add,把得出的結果傳回給mexFunction的另一個參數(shù),Matlab通過該參數(shù)來給出在Matlab語句中調用函數(shù)時的輸出值(如上例中的a)。 比如該C文件已寫好,名為add.c。那么在Matlab中,輸入: >> mex add.c 就能把add.c編譯為MEX文件(編譯器的設置使用指令mex -setup),在Windows中,MEX文件類型為mexw32,即現(xiàn)在我們得出add.mexw32文件?,F(xiàn)在,我們就可以像調用M函數(shù)那樣調用MEX文件,如上面說到的例子。所以,通過MEX文件,使用C函數(shù)就和使用M函數(shù)是一樣的了。 我們現(xiàn)在來說mexFunction怎樣寫。 mexFunction的定義為: void mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[]) {} 可以看到,mexFunction是沒返回值的,它不是通過返回值把結果傳回Matlab的,而是通過對參數(shù)plhs的賦值。mexFunction的四個參數(shù)皆是說明Matlab調用MEX文件時的具體信息,如這樣調用函數(shù)時: >> b = 1.1; c = 2.2; >> a = add(b, c) mexFunction四個參數(shù)的意思為: nlhs = 1,說明調用語句左手面(lhs-left hand side)有一個變量,即a。 nrhs = 2,說明調用語句右手面(rhs-right hand side)有兩個自變量,即b和c。 plhs是一個數(shù)組,其內容為指針,該指針指向數(shù)據(jù)類型mxArray。因為現(xiàn)在左手面只有一個變量,即該數(shù)組只有一個指針,plhs[0]指向的結果會賦值給a。 prhs和plhs類似,因為右手面有兩個自變量,即該數(shù)組有兩個指針,prhs[0]指向了b,prhs[1]指向了c。要注意prhs是const的指針數(shù)組,即不能改變其指向內容。 因為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類型的指針數(shù)組。 完整的add.c如下: // add.c #include "mex.h" // 使用MEX文件必須包含的頭文件 // 執(zhí)行具體工作的C函數(shù) double add(double x, double y) {return x + y; } // MEX文件接口函數(shù) 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的內容是什么意思呢?我們知道,如果這樣調用函數(shù)時: >> output = add(1.1, 2.2); 在未涉及具體的計算時,output的值是未知的,是未賦值的。所以在具體的程序中,我們建立一個1x1的實double矩陣(使用mxCreateDoubleMatrix函數(shù),其返回指向剛建立的mxArray的指針),然后令plhs[0]指向它。接著令指針a指向plhs[0]所指向的mxArray的第一個元素(使用mxGetPr函數(shù),返回指向mxArray的首元素的指針)。同樣地,我們把prhs[0]和prhs[1]所指向的元素(即1.1和2.2)取出來賦給b和c。于是我們可以把b和c作自變量傳給函數(shù)add,得出給果賦給指針a所指向的mxArray中的元素。因為a是指向plhs[0]所指向的mxArray的元素,所以最后作輸出時,plhs[0]所指向的mxArray賦值給output,則output便是已計算好的結果了。 上面說的一大堆指向這指向那,什么mxArray,初學者肯定都會被弄到頭暈眼花了。很抱歉,要搞清楚這些亂糟糟的關系,只有多看多練。 實際上mexFunction是沒有這么簡單的,我們要對用戶的輸入自變量的個數(shù)和類型進行測試,以確保 輸入正確。如在add函數(shù)的例子中,用戶輸入char array便是一種錯誤了。 從上面的講述中我們總結出,MEX文件實現(xiàn)了一種接口,把C語言中的計算結果適當?shù)胤祷亟oMatlab罷了。當我們已經(jīng)有用C編寫的大型程序時,大可不必在Matlab里重寫,只寫個接口,做成MEX文件就成了。另外,在Matlab程序中的部份計算瓶頸(如循環(huán)),可通過MEX文件用C語言實現(xiàn),以提高計算速度。

總結

以上是生活随笔為你收集整理的matlab调c的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。