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]),以此类推。如果右侧输入是一个数的话,可以采取下述形式
为所有输出分配好空间后并得到接口指针, 就可以调用C语言函数。
3.2matlab部分语言的编写
初次使用matlab的mex时,需要配置mex。在matlab参数行中输入mex -setup然后按照提示一步步配置完成后。输入mex ++++.cpp(需要mex的C语言文件名),之后就可以非常愉快的当做matlab的一个内置函数轻松调用了。