首页 > 学院 > 开发设计 > 正文

Matlab调用C接口

2019-11-08 02:27:14
字体:
来源:转载
供稿:网友

matlab调用C语言mex

标签(空格分隔): 学习笔记


一、为什么要用C语言编写MEX文件

MATLAB是矩阵语言,是为向量和矩阵操作设计的,一般来说,如果运算可以用向量或矩阵实现,其运算速度是非常快的。但若运算中涉及到大量的循环处理,MATLAB的速度的令人难以忍受的。解决方法之一为,当必须使用for循环时,把它写为MEX文件,这样不必在每次运行循环中的语句时MATLAB都对它们进行解释。

二、 编译器的安装与配置

要使用MATLAB编译器,用户计算机上应用事先安装与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自带,只能用来产生MEX文件)

下面是安装与配置MATLAB编译器应用程序MEX的设置的步骤:

(1)在MATLAB命令窗口中运行mex –setup,出现下列提示:

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

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

(2)选择y,MATLAB将自动搜索计算机上已安装的外部编译器的类型、版本及所在路径,并列出来让用户选择:

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让用户进行确认:

Please verify your choices:

Compiler: Lcc C 2.4

Location: D:/MATLAB6P5P1/sys/lcc

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

(4)选择y,结束MATLAB编译器的配置。

三、一个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的剩余数据 for (int i = 1; i < graylevel_8; i++) // 合并点个数的循环 { ///////////////////////////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; } //将求得的最少失真和合并点返回 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调用c语言的接口函数,函数的输入时固定的,int nlhs表示左边参数的个数,这在matlab中是输出的个数, mxArray *plhs[]用来存放输出,新建是必须用矩阵的形式新建,如果输出只是一个数的话,也需要新建一个1*1大小的矩阵;同理,nrhs是输入的个数, mxArray *prhs[]用来存放输入。 对于输入,首先调用mxGetPr(prhs[])函数,获得输入的入口指针,第一个输入为 mxGetPr(prhs[0]),第二个输入为mxGetPr(prhs[1]),以此类推。如果右侧输入是一个数的话,可以采取下述形式 graylevel8=∗(mxGetPr(prhs[2])); 为所有输出分配好空间后并得到接口指针, 就可以调用C语言函数。

3.2matlab部分语言的编写

初次使用matlab的mex时,需要配置mex。在matlab参数行中输入mex -setup然后按照提示一步步配置完成后。输入mex ++++.cpp(需要mex的C语言文件名),之后就可以非常愉快的当做matlab的一个内置函数轻松调用了。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表