编写 Matlab mexFunction (C mex)

资料一 MATLAB的MEX文件编写和调试

1. MEX的编写格式

写MEX程序其实就是写一个DLL程序,所以你可以使用C,C++,Fortran等多种编程语言来写。

编写MEX程序的编辑器可以使用MATLAB的代码编辑器,也可使用自己的C++编辑器,如VS2008等。

用MATLAB的编辑器的好处是,MEX函数会加粗高亮显示,这给程序编写带来便利,可惜无法动态调试。如用VC即可编译也可调试,比较方便。mex的编译结果实际上就是一个带输出函数mexFunction 的dll文件,所以会用VC编写和调试dll,就会用VC编写和调试MEX程序。

a. MEX文件格式

#include "mex.h"

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] )

{

}

四个参数分别用来输出和输入数据: nlhs 输出参数个数,plhs 输出参数指针 (nrhs和prhs是输入参数相关的)。

注意: 我们对输出和输入参数的操作都是通过指针的方式进行的。(这点很容易理解,因为我们的计算结果是需要传递给MATLAB的,实际上我们传递的不是数据,而是指针。MATLAB可以通过这些指针,访问内存中的数据。)

b. 操作输入数据

对输入数据进行操作,需要通过MEX函数mxGetPr 得到数据的指针地址。 mxGetM 和 mxGetN 得到矩阵数据的行和列 (返回整数)。对于实矩阵,我们可以定义 double *M; 来对实矩阵数据操作(不过似乎是,plhs, prhs都是指向double类型的指针,所以下面的这个M等,都要定义成double*类型的)。如:

double *M;

int m, n;

M = mxGetPr(prhs[0]); // 指针指向第一个参数的数据地址

m = mxGetM(prhs[0]);

n = mxGetN(prhs[0]);

需要注意的是,MATLAB矩阵数据的存储顺序是"从上到下,从左到右"。也就是说对于MATLAB的m x n的矩阵A。 A(1,1) 就是 *M,A(2,1) 就是 *(M+1) ,以此类推,A(i, j) 就是 *(M + m*(j-1) + (i-1)).

注意: MATLAB的指标从1开始,C的指标从0开始。

c. 操作输出数据

对于输出数据,我们需要首先分配内存空间,有专门的mex函数可以使用,如:

plhs[0] = mxCreateDoubleMatrix(m, n, mxREAL); //生成m x n 的实矩阵。

同输入数据一样,要对输出数据操作,我们也需要一个指向数据的指针变量,如

double *A;

A = mxGetPr( plhs[0]);

下面介绍一下如何使用VS2008编写MEX并编译调试。

2. VC中编写MEX

打开Visual Studio 2008/2010/2012/2013, 新建项目, 选择MFC DLL.

a. 配置项目属性

打开项目属性配置页,选择配置属性目录,然后分别进行如下操作

VC++目录 -> 包含目录    加入MATLAB安装目录下的 \extern\include 路径。

VC++目录 -> 库目录       加入MATLAB的 \extern\lib\win32\microsoft 路径。

连接器 -> 输入 -> 附加依赖项   输入libmx.lib libeng.lib libmat.lib libmex.lib

b. 编辑输出函数

在项目源文件的. def 中EXPORTS段加入mexFunction, 如:

EXPORTS ; 此处可以是显式导出 mexFunction

c. 编写MEX文件

项目文件中新建一个C++文件 如 mexproc.cpp,里面按前面介绍的格式编写代码即可。

d. VC编译MEX

像编译其他程序那样直接编译即可,成功会生成dll文件。如果编译链接时出错,根据错误提示,检查一下lib和h的路径是否正确,有无缺少lib文件,代码是否有语法错误等。

3. VC中调试MEX

要调试MEX程序就要先编译,再调用它。所以我们需要在MATLAB中调用这个函数,并在VC的MEX程序相应位置处下断点即可。调用的函数名就是dll的主文件名,你可以根据自己的需要改名。

我们用mymexfun.dll为例,先在VC的 mexFunction 函数代码段开始处F9下断。然后Ctrl+Alt+P附加MATLAB.exe进程。这样就可以运行命令调试程序了。我们可以在MATLAB的命令行里输入命令:

[输出变量] = mymexfun(输入变量)

程序一旦被调用,就会被断在我们的断点处。接着你就可以像调试C++程序那样调试MEX程序了。(如果命令找不到,检查一下matlab当前路径,和path路径。)

在MATLAB中编译MEX可以输入: mex 文件名.cpp

MATLAB上编译MEX时,你可以选择不同的编译器如lc, gcc等。也可以在编译时附加lib和h文件。关于mex的命令详解请参考MATLAB帮助文档。

资料二

在使用MATLAB编译C/C++代码时,C/C++代码中要使用一个mexFunction函数,那么这个函数是如何定义,在编译时又是如何实现的呢?下面我将使用实例进行说明。

如一个简单的函数:

double add(double x, double y)

{

return x + y;

}

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如下:

//我的第一个mexFunction测试文件

#include "mex.h"//使用mex文件必须包含头文件

//执行具体工作的C函数

double add(double x, double y)

{

return x+y;

}

//MEX文件接口函数

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, 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的内容是什么意思呢?我们知道,如果这样调用函数时:

>> 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便是已计算好的结果了。

实际上mexFunction是没有这么简单的,我们要对用户的输入自变量的个数和类型进行测试,以确保输入正确。如在add函数的例子中,用户输入char array便是一种错误了。

从上面的讲述中我们总结出,MEX文件实现了一种接口,把C语言中的计算结果适当地返回给Matlab罢了。当我们已经有用C编写的大型程序时,大可不必在 Matlab里重写,只写个接口,做成MEX文件就成了。另外,在Matlab程序中的部份计算瓶颈(如循环),可通过MEX文件用C语言实现,以提高计算速度。

一个简单的MEX文件例子:用m文件建立一个1000×1000的Hilbert矩阵。

% mextest.m

tic

m=1000;

n=1000;

a=zeros(m,n);

for i=1:1000

for j=1:1000

a(i,j)=1/(i+j);

end

end

toc

在matlab中新建一个Matlab_1.cpp 文件并输入以下程序:

#include "mex.h"

//该函数是mexfunction调用的唯一一个计算子程序

void hilb(double *y,int n)

{

int i,j;

for(i=0;i<n;i++)

for(j=0;j<n;j++)

*(y+j+i*n)=1/((double)i+(double)j+1);

}

void mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[])

{

double x,*y;

int n;

if (nrhs!=1)

mexErrMsgTxt("One inputs required.");

if (nlhs != 1)

mexErrMsgTxt("One output required.");

if (!mxIsDouble(prhs[0])||mxGetN(prhs[0])*mxGetM(prhs[0])!=1)

mexErrMsgTxt("Input must be scalars.");

x=mxGetScalar(prhs[0]);

plhs[0]=mxCreateDoubleMatrix(x, x, mxREAL);

n=mxGetM(plhs[0]);

y=mxGetPr(plhs[0]);

hilb(y, n);

}

该程序是一个C语言程序,它也实现了建立Hilbert矩阵的功能。在MATLAB命令窗口输入以下命令:mex Matlab_1.cpp,即可编译成功。进入该文件夹,会发现多了一个文件:Matlab_1.mexw32,其中Matlab_1.mexw32即是MEX文件。运行下面程序:

tic

a=Matlab_1(1000);

toc

由上面实验看出,同样功能的MEX文件比m文件快得多。

MEX文件的组成与参数

MEX文件的源代码一般由两部分组成:

(1)计算过程。该过程包含了MEX文件实现计算功能的代码,是标准的C语言子程序。

(2)入口过程。该过程提供计算过程与MATLAB之间的接口,以入口函数mxFunction实现。在该过程中,通常所做的工作是检测输入、输出参数个数和类型的正确性,然后利用mx-函数得到MATLAB传递过来的变量(比如矩阵的维数、向量的地址等),传递给计算过程。

MEX文件的计算过程和入口过程也可以合并在一起。但不管那种情况,都要包含#include "mex.h",以保证入口点和接口过程的正确声明。注意,入口过程的名称必须是mexFunction,并且包含四个参数,即:

void mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[])

其中,参数nlhs和nrhs表示MATLAB在调用该MEX文件时等式左端和右端变量的个数,例如在MATLAB命令窗口中输入以下命令:

[a,b,c]=Matlab_1(d,e,f,g)

则nlhs为3,nrhs为4。

MATLAB在调用MEX文件时,输入和输出参数保存在两个mxArray*类型的指针数组中,分别为prhs[]和plhs[]。prhs[0]表示第一个输入参数,prhs[1]表示第二个输入参数,…,以此类推。如上例中,d→prhs[0],e→prhs[1],f→prhs[2],f→prhs[3]。同时注意,这些参数的类型都是mxArray *。

接口过程要把参数传递给计算过程,还需要从prhs中读出矩阵的信息,这就要用到下面的mx-函数和mex-函数。

第三部分

1 MEX文件的组成与参数

[转载]

MEX文件的源代码一般由两部分组成:

(1)计算过程。该过程包含了MEX文件实现计算功能的代码,是标准的C语言子程序。

(2)入口过程。该过程提供计算过程与MATLAB之间的接口,以入口函数mxFunction实现。在该过程中,通常所做的工作是检测输入、输出参数个数和类型的正确性,然后利用mx-函数得到MATLAB传递过来的变量(比如矩阵的维数、向量的地址等),传递给计算过程。

MEX文件的计算过程和入口过程也可以合并在一起。但不管那种情况,都要包含#include "mex.h",以保证入口点和接口过程的正确声明。注意,入口过程的名称必须是mexFunction,并且包含四个参数,即:

void mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[])

其中,参数nlhs和nrhs表示MATLAB在调用该MEX文件时等式左端和右端变量的个数,例如在MATLAB命令窗口中输入以下命令:

[a,b,c]=Matlab_1(d,e,f,g)

则nlhs为3,nrhs为4。

MATLAB在调用MEX文件时,输入和输出参数保存在两个mxArray*类型的指针数组中,分别为prhs[]和plhs[]。prhs[0]表示第一个输入参数,prhs[1]表示第二个输入参数,…,以此类推。如上例中,d→prhs[0],e→prhs[1],f→prhs[2],f→prhs[3]。同时注意,这些参数的类型都是mxArray *。

接口过程要把参数传递给计算过程,还需要从prhs中读出矩阵的信息,这就要用到下面的mx-函数和mex-函数。

2 常用的mex-函数和mx-函数

在MATLAB6.5版本中,提供的mx-函数有106个,mex-函数有38个,下面我们仅介绍常用的函数。

2.1入口函数mexFunction

该函数是C MEX文件的入口函数,它的格式是固定的:

void mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[])

说明:MATLAB函数的调用方式一般为:[a,b,c,…]=被调用函数名称(d,e,f,…),nlhs保存了等号左端输出参数的个数,指针数组plhs具体保存了等号左端各参数的地址,注意在plhs各元素针向的mxArray内存未分配,需在接口过程中分配内存;prhs保存了等号右端输入参数的个数,指针数组prhs具体保存了等号右端各参数的地址,注意MATLAB在调用该MEX文件时,各输入参数已存在,所以在接口过程中不需要再为这些参数分配内存。

2.2出错信息发布函数mexErrMsgTxtmexWarnMsgTxt

两函数的具体格式如下:

#include "mex.h"

void mexErrMsgTxt(const char *error_msg);

void mexWarnMsgTxt(const char *warning_msg);

其中error_msg包含了要显示错误信息,warning_msg包含要显示的警告信息。两函数的区别在于mexErrMsgTxt显示出错信息后即返回到MATLAB,而mexWarnMsgTxt显示警告信息后继续执行。

2.3 mexCallMATLAB和mexEvalString

两函数具体格式如下:

#include "mex.h"

int mexCallMATLAB(int nlhs, mxArray *plhs[],

int nrhs, mxArray *prhs[], const char *command_name);

int mexEvalString(const char *command);

mexCallMATLAB前四个参数的含义与mexFunction的参数相同,command_name可以MATLAB内建函数名、用户自定义函数、M文件或MEX文件名构成的字符串,也可以MATLAB合法的运算符。

mexEvalString用来操作MATLAB空间已存在的变量,它不返回任何参数。

mexCallMATLAB与mexEvalString差异较大,请看下面的例子。

【例2】试用MEX文件求5阶完全图邻接矩阵 的特征值及对应的特征向量。
5阶完全图的邻接矩阵为:(这里找不到图片了,抱歉。不过不会影响您对本文的理解。)

下面是求该矩阵的MEX文件。

[Matlab_2.cpp]

#include "mex.h"

void mexFunction(int
nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[])

{

double x;

mxArray *y,*z,*w;

int n;

if
(nrhs!=1)

mexErrMsgTxt("One inputs required.");

if (nlhs !=
3)

mexErrMsgTxt("Three output required.");

if
(!mxIsDouble(prhs[0])||mxGetN(prhs[0])*mxGetM(prhs[0])!=1)

mexErrMsgTxt("Input must be a scalar.");

x=mxGetScalar(prhs[0]);

plhs[0]=mxCreateDoubleMatrix(x,x,mxREAL);

plhs[1]=mxCreateDoubleMatrix(x,x,mxREAL);

plhs[2]=mxCreateDoubleMatrix(x,x,mxREAL);

n=mxGetM(plhs[0]);

y=plhs[0];

z=plhs[1];

w=plhs[2];

//利用mexCallMATLAB计算特征值

mexCallMATLAB(1,&plhs[1],1,prhs,"ones");

mexCallMATLAB(1,&plhs[2],1,prhs,"eye");

mexCallMATLAB(1,&plhs[0],2,&plhs[1],"-");

mexCallMATLAB(2,&plhs[1],1,&plhs[0],"eig");

//演示mexEvalString的功能

mexEvalString("y=y*2");

mexEvalString("a=a*2");

}

在MATLAB命令窗口输入以下命令:

>> mex Matlab_2.cpp

>> clear

>> a=magic(5)

a =

17     24      1     
8     15

23      5     
7     14     16

4      6    
13     20     22

10     12    
19     21      3

11     18    
25      2      9

>> [y,z,w]=Matlab_2(5)

??? Undefined function or
variable ‘y‘.

a =

34     48     
2     16     30

46     10    
14     28     32

8     12     26    
40     44

20     24    
38     42      6

22     36    
50      4     18

y =

0      1     
1      1      1

1      0     
1      1      1

1      1     
0      1      1

1      1     
1      0      1

1      1     
1      1      0

z =

0.8333    -0.1667   
-0.1667     0.2236     0.4472

-0.1667     0.8333   
-0.1667     0.2236     0.4472

-0.1667    -0.1667    
0.8333     0.2236     0.4472

-0.5000    -0.5000   
-0.5000     0.2236     0.4472

0         
   0         
  0          -0.8944    0.4472

w =

-1      0     
0      0      0

0     -1     
0      0      0

0      0    
-1      0      0

0      0     
0     -1      0

0      0     
0      0      4

由上面可以看出,K5的特征值为–1和4,其中–1是四重根。MATLAB提供了mexGetVariable、mexPutVariable函数,以实现MEX空间与其它空间交换数据的任务,具体可以参看MATLAB帮助文档。

2.4建立二维双精度矩阵函数mxCreateDoubleMatrix

其格式具体如下:

#include "matrix.h"

mxArray
*mxCreateDoubleMatrix(int m, int n, mxComplexity ComplexFlag);

其中m代表行数,n代表列数,ComplexFlag可取值mxREAL 或mxCOMPLEX。如果创建的矩阵需要虚部,选择mxCOMPLEX,否则选用mxREAL。

类似的函数有:


mxCreateCellArray


创建n维元胞mxArray


mxCreateCellMatrix


创建二维元胞mxArray


mxCreateCharArray


创建n维字符串mxArray


mxCreateCharMatrixFromStrings


创建二维字符串mxArray


mxCreateDoubleMatrix


创建二维双精度浮点mxArray


mxCreateDoubleScalar


创建指定值的二维精度浮点mxArray


mxCreateLogicalArray


创建n维逻辑mxArray,初值为false


mxCreateLogicalMatrix


创建二维逻辑mxArray,初值为false


mxCreateLogicalScalar


创建指定值的二维逻辑mxArray


mxCreateNumericArray


创建n维数值mxArray


mxCreateNumericMatrix


创建二维数值mxArray,初值为0


mxCreateScalarDouble


创建指定值的双精度mxArray


MxCreateSparse


创建二维稀疏mxArray


mxCreateSparseLogicalMatrix


创建二维稀疏逻辑mxArray


MxCreateString


创建指定字符串的1 n的串mxArray


mxCreateStructArray


创建n维架构mxArray


mxCreateStructMatrix


创建二维架构mxArray

2.5 获取行维和列维函数mxGetMmxGetN

其格式如下:

#include "matrix.h"

int mxGetM(const mxArray
*array_ptr);

int mxGetN(const mxArray
*array_ptr);

与之相关的还有:

mxSetM:设置矩阵的行维

mxSetN:设置矩阵的列维

2.6 获取矩阵实部和虚部函数mxGetPrmxGetPi

其格式如下:

#include "matrix.h"

double *mxGetPr(const mxArray
*array_ptr);

double *mxGetPi(const mxArray
*array_ptr);

与之相关的函数还有:

mxSetPr:设置矩阵的实部

mxSetPi:设置矩阵的虚部

【例3】实现字符串的倒序输出。

#include "mex.h"

void revord(char
*input_buf,int buflen,char *output_buf)

{

int i;

//实现字符串倒序

for(i=0;i<buflen-1;i++)

*(output_buf+i)=*(input_buf+buflen-i-2);

}

void mexFunction(int
nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[])

{

//定义输入和输出参量的指针

char
*input_buf,*output_buf;

int
buflen,status;

//检查输入参数个数

if(nrhs!=1)

mexErrMsgTxt("One input required.");

else
if(nlhs>1)

mexErrMsgTxt("Too many output arguments.");

//检查输入参数是否是一个字符串

if(mxIsChar(prhs[0])!=1)

mexErrMsgTxt("Input must be a string.");

//检查输入参数是否是一个行变量

if(mxGetM(prhs[0])!=1)

mexErrMsgTxt("Input must a row vector.");

//得到输入字符串的长度

buflen=(mxGetM(prhs[0])*mxGetN(prhs[0]))+1;

//为输入和输出字符串分配内存

input_buf=mxCalloc(buflen,sizeof(char));

output_buf=mxCalloc(buflen,sizeof(char));

//将输入参量的mxArray结构中的数值拷贝到C类型字符串指针

status=mxGetString(prhs[0],input_buf,buflen);

if(status!=0)

mexWarnMsgTxt("Not enough space. String is truncated.");

//调用C程序

revord(input_buf,buflen,output_buf);

plhs[0]=mxCreateString(output_buf);

}

这个程序中需要注意的地方是mxCalloc函数,它代替了标准C程序中的calloc函数用于动态分配内存,而mxCalloc函数采用的是MATLAB的内存管理机制,并将所有申请的内存初始化为0,因此凡是C代码需要使用calloc函数的地方,对应的Mex文件应该使用mxCalloc函数。同样,凡是C代码需要使用realloc函数的地方,对应的Mex文件应该使用mxRealloc函数。

在MATLAB命令窗口中对revord.cpp程序代码编译链接:

>> mex revord.cpp

在MATLAB命令窗口中对C-MEX文件revord.dll进行测试:

>> x=‘I am student.‘;

>> revord(x)

ans =

.tneduts ma I

[原作者赠言] 终于写完了,相信大家对mex文件应该有点熟悉了,具体还要到实际应用中慢慢体会。

时间: 2024-08-10 15:02:54

编写 Matlab mexFunction (C mex)的相关文章

为什么安装了MinGW之后,还是不能在Matlab中使用mex?

原文地址:http://blog.sina.com.cn/s/blog_53c7b1580102xjcw.html 老版本的Matlab自带lcc,在Matlab中输入mex -setup就可以选择.设置.如果电脑中还安装了VC之类的其它C编译器,Matlab也会列出,供你选择哪个编译器.但高版本的Matlab用起来没这么简单.我用2015b,输入mex -setup,提示:“错误使用 mex未找到支持的编译器或 SDK.您可以安装免费提供的 MinGW-w64 C/C++ 编译器:请参阅安装

Matlab中利用mex编译Opencv实现画板绘图功能

图形绘制是标记和可视化数据的重要方法. 通过在Matlab中集成画板绘图功能, 可为科学计算提供便利. 1 设置Matlab支持Opencv编译 操作系统: 麒麟14.04(基于Ubuntu 14.04) 命令: mex -v -> mexopts.sh sourced from directory (DIR = $MATLAB/bin) FILE = /usr/local/MATLAB/R2013a/bin/mexopts.sh --------------------------------

(原)matlab中使用mex编译多个cpp文件

以前一直是mex一个文件.刚才需要编译多个文件(如a.cpp调用b.cpp的函数,b.cpp调用c.cpp的函数).如果只是mex a.cpp,提示函数找不到函数. 突然想到mex c.cpp b.cpp a.cpp,最后只生成了c.mexw64. 然后想到如果反过来写的话mex a.cpp b.cpp c.cpp,成功的生成了a.mexw64. 以前没这样做过,所以不清楚.才知道可以这个样子.

在Visual Studio中开发Matlab mex文件,生成mexw64/mexw32

csunking贡献,2015-9-22 1712 1.   概述 通过使用C/C++与Matlab混合编程,既可以享受到C代码快速执行的速度,又可以方便的使用Matlab众多的库函数和强大的绘图功能.让Matlab调用C函数是通过DLL文件实现的,而这个DLL的开发过程不仅仅可以使用Matlab自带的mex命令,还可以使用VC++开发环境,使用VC有很多好处,一是让我回到了原来熟悉的开发环境中,二能够使用更加标准的C++编译器,第三点也是最爽的,可以使用VC强大的调试功能. 此次文档更新时使用

MEX文件编写和调试

作者kaien,2010/02/16 以前我写过一篇文章,详细的介绍过MEX的格式,语法,编译,调试等.可惜记不清放在哪里了.而最近又用到MEX编程,所以只能重新温习一番.时间有限,只记下简要流程和注意事项,以便往后查询之需. 1. MEX的编写格式 写MEX程序其实就是写一个DLL程序,所以你可以使用C,C++,Fortran等多种编程语言来写. 编写MEX程序的编辑器可以使用MATLAB的代码编辑器,也可使用自己的C++编辑器,如VS2008等. 用 MATLAB的编辑器的好处是,MEX函数

Matlab以MEX方式调用C源代码【转载】

原文地址:http://blog.sina.com.cn/s/blog_468651400100coas.html 如果我有一个用C语言写的函数,实现了一个功能,如一个简单的函数: double add(double x, double y) { return x + y; } 现在我想要在Matlab中使用它,比如输入: >> a = add(1.1, 2.2) 3.3000 要得出以上的结果,那应该怎样做呢? 解决方法之一是要通过使用MEX文件,MEX文件使得调用C函数和调用Matlab的

Matlab与C/C++联合编程之Matlab以MEX方式调用C/C++代码(二)

如果我有一个用C语言写的函数,实现了一个功能,如一个简单的函数: double add(double x, double y) { return x + y; } 现在我想要在Matlab中使用它,比如输入: >> a = add(1.1, 2.2) 3.3000 要得出以上的结果,那应该怎样做呢? 解决方法之一是要通过使用MEX文件,MEX文件使得调用C函数和调用Matlab的内置函数一样方便.MEX文件是由原C代码加上MEX文件专用的接口函数后编译而成的.可以这样理解,MEX文件实现了一种

使用matlab进行mex编译时的路径问题mexopts

matlab和vs 进行混合编程时总需要使用matlab编译mexFunction.cpp文件.这些文件免不了使用include下的*.h和lib下的*.lib文件.举例说明,这次我的cpp中用到了opencv/cv.h.在matlab\bin\win64\mexopts文件夹下有一个msvsopts100.bat的批处理文件. 用notepad 将这个文件打开在"include=" 和 "lib=" 后面添加需要使用的路径并加分号";" 设置好

ubuntu系统下cmake 编译matlab中mex文件

cmake 编译工程具有独特的优势,特别对于复杂的工程更是如此.利用matlab直接编译mex文件时,对于文件数据多的工程时,需要列举所有文件,并且要按照依赖关系排序,这些都是直接采用matalb编译mex的缺点. 下面通过一个简单的加法函数例子,说明如何利用cmake编译生成mex文件.如何对系统动态库进行设置,使matlab能够正常调用mex函数. 首先说明如何生成mex文件. 本例首先利用add.h.add.cpp文件编译生成add.so动态文件库,然后利用mian.cpp文件调用add.