国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

Matlab調(diào)用C接口

2019-11-08 02:27:14
字體:
供稿:網(wǎng)友

matlab調(diào)用C語言mex

標(biāo)簽(空格分隔): 學(xué)習(xí)筆記


一、為什么要用C語言編寫MEX文件

MATLAB是矩陣語言,是為向量和矩陣操作設(shè)計(jì)的,一般來說,如果運(yùn)算可以用向量或矩陣實(shí)現(xiàn),其運(yùn)算速度是非常快的。但若運(yùn)算中涉及到大量的循環(huán)處理,MATLAB的速度的令人難以忍受的。解決方法之一為,當(dāng)必須使用for循環(huán)時(shí),把它寫為MEX文件,這樣不必在每次運(yùn)行循環(huán)中的語句時(shí)MATLAB都對它們進(jìn)行解釋。

二、 編譯器的安裝與配置

要使用MATLAB編譯器,用戶計(jì)算機(jī)上應(yīng)用事先安裝與MATLAB適配的以下任何一種ANSI C/C++編譯器:

5.0、6.0版的MicroSoft Visual C++(MSVC)

5.0、5.2、5.3、5.4、5.5版的Borland C++

LCC(由MATLAB自帶,只能用來產(chǎn)生MEX文件)

下面是安裝與配置MATLAB編譯器應(yīng)用程序MEX的設(shè)置的步驟:

(1)在MATLAB命令窗口中運(yùn)行mex –setup,出現(xiàn)下列提示:

Please choose your compiler for building external interface (MEX) files:

Would you like mex to locate installed compilers [y]/n?

(2)選擇y,MATLAB將自動搜索計(jì)算機(jī)上已安裝的外部編譯器的類型、版本及所在路徑,并列出來讓用戶選擇:

Select a compiler:

[1] Borland C++Builder version 6.0 in C:/PRogram Files/Borland

[2] Digital Visual Fortran version 6.0 in C:/Program Files/Microsoft Visual Studio

[3] Lcc C version 2.4 in D:/MATLAB6P5P1/sys/lcc

[4] Microsoft Visual C/C++ version 6.0 in C:/Program Files/Microsoft Visual Studio

[0] None

Compiler:

(3)選擇其中一種(在這里選擇了3),MATLAB讓用戶進(jìn)行確認(rèn):

Please verify your choices:

Compiler: Lcc C 2.4

Location: D:/MATLAB6P5P1/sys/lcc

Are these correct?([y]/n):

(4)選擇y,結(jié)束MATLAB編譯器的配置。

三、一個(gè)mex例子

3.1c語言部分的編寫

#include<Windows.h>#include"mex.h"void dynamicPrograming(double* graph, double* location, double* path, int graylevel_10,int graylevel_8){ for (int i = 0; i < graylevel_10; i++) { path[i] = graph[i]; location[i] = 0; } //接下來填充path的剩余數(shù)據(jù) for (int i = 1; i < graylevel_8; i++) // 合并點(diǎn)個(gè)數(shù)的循環(huán) { ///////////////////////////j = i?;/////////////////// for (int j = i; j < graylevel_10; j++) { double current_cost = 10000000; for (int k = i; k < j; k++) { double temp_cost = path[(i - 1) * graylevel_10 + k] + graph[k * graylevel_10 + j]; if (temp_cost < current_cost) { current_cost = temp_cost; location[i * graylevel_10 + j] = k; } //將求得的最少失真和合并點(diǎn)返回 path[i * graylevel_10 + j] = current_cost; } } }}void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]){ double* graph; double* location; double* path; int graylevel_10; int graylevel_8; //輸入 graph = mxGetPr(prhs[0]); graylevel_10 = *(mxGetPr(prhs[1])); graylevel_8 = *(mxGetPr(prhs[2])); //輸出 plhs[0] = mxCreateDoubleMatrix(graylevel_10, graylevel_8, mxREAL); location = mxGetPr(plhs[0]); plhs[1] = mxCreateDoubleMatrix(graylevel_10, graylevel_8, mxREAL); path = mxGetPr(plhs[1]); dynamicPrograming(graph, location, path, graylevel_10, graylevel_8);}

在上述代碼中,mexFunction是matlab調(diào)用c語言的接口函數(shù),函數(shù)的輸入時(shí)固定的,int nlhs表示左邊參數(shù)的個(gè)數(shù),這在matlab中是輸出的個(gè)數(shù), mxArray *plhs[]用來存放輸出,新建是必須用矩陣的形式新建,如果輸出只是一個(gè)數(shù)的話,也需要新建一個(gè)1*1大小的矩陣;同理,nrhs是輸入的個(gè)數(shù), mxArray *prhs[]用來存放輸入。 對于輸入,首先調(diào)用mxGetPr(prhs[])函數(shù),獲得輸入的入口指針,第一個(gè)輸入為 mxGetPr(prhs[0]),第二個(gè)輸入為mxGetPr(prhs[1]),以此類推。如果右側(cè)輸入是一個(gè)數(shù)的話,可以采取下述形式 graylevel8=?(mxGetPr(prhs[2])); 為所有輸出分配好空間后并得到接口指針, 就可以調(diào)用C語言函數(shù)。

3.2matlab部分語言的編寫

初次使用matlab的mex時(shí),需要配置mex。在matlab參數(shù)行中輸入mex -setup然后按照提示一步步配置完成后。輸入mex ++++.cpp(需要mex的C語言文件名),之后就可以非常愉快的當(dāng)做matlab的一個(gè)內(nèi)置函數(shù)輕松調(diào)用了。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 土默特右旗| 佛冈县| 娄烦县| 肃宁县| 恭城| 镇平县| 尚志市| 积石山| 休宁县| 辰溪县| 墨竹工卡县| 奈曼旗| 漳州市| 芜湖市| 旌德县| 财经| 大新县| 新巴尔虎左旗| 五大连池市| 安泽县| 阳信县| 漾濞| 登封市| 阆中市| 特克斯县| 台前县| 兰西县| 奉化市| 英德市| 平和县| 五台县| 莫力| 鲁甸县| 华池县| 确山县| 长沙县| 韩城市| 荃湾区| 沧源| 岳阳县| 介休市|