我是靠谱客的博主 淡定外套,最近开发中收集的这篇文章主要介绍matlab mex c 例子,10分钟教会你简单的matlab和C/C++混合编程(mex文件),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

最近要用matlab提取视频的特征,数据量很大,程序跑起来很慢,于是把其中一个模块改为用C语言来实现。我在这里也记录一下自己的一些心得。

我用的编译器是matlab自带的Lcc-win32 C 2.4.1编译器,好处是可以不依赖高级编译器(如VS、GCC),保证程序只要有matlab即可运行;缺点是只能用C写,不能使用C++的库(比如vector、OpenCV)。所以以下这篇文章只适用于针对矩阵、数组(不包括字符串string、元胞cell)的简单的mex文件编写。

用Lcc编译器编写mex文件的几个注意事项:

1、注释不能有中文,否则报错:Specified export _mexFunction is not defined

2、所有变量定义必须在函数最前面完成,变量没有定义完,不可以执行其他操作,否则报错:illegal statement termination

下面是一个计算矩阵a-b的例子,

其中mexFunction是默认函数名,不用修改,因为matlab调用的时候用的是mex的文件名,而不是函数名。

nlhs代表的是输出参数的个数

plhs是一个指针数组,里面的指针指向mxArray类型,每一个指针指向一个输出

nrhs代表的是输入参数的个数

prhs是一个指针数组,里面的指针指向mxArray类型,每一个指针指向一个输入

#include "mex.h"

#include "matrix.h"

// b = [1 2;3 4]

// a = [5 6;7 8]

// c = mex_func(a(:), b, size(a,1)) % attention ! a is a(:)

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

{

double *data1 = mxGetPr(prhs[0]); //get pointer of a(is a vector)

double *data2 = mxGetPr(prhs[1]); //get pointer of b(is a matrix)

int data1_num = mxGetM(prhs[0]); // get elements num of data1

int data1_h = mxGetScalar(prhs[2]);//get height of matrix a

int data1_w = data1_num/data1_h; //calculate the width of matrix a

// the step above is no need when dealing with 2D matrix

int data2_h = mxGetM(prhs[1]);// get rows of data2

int data2_w = mxGetN(prhs[1]);// get cols of data2

int output_h = data1_h;

int output_w = data1_w;

int i,j;

double **copy_array;// pointer of mid-data

double *y;

//end variable defination, all the defination shoule be set at the beginning

//******************************************************

if ((data1_h!=data2_h)||(data1_w!=data2_w)){

printf("matrix dim not matched!n");

}

//setup mid-data

copy_array = (double **)malloc(sizeof(double *) * output_h);

for(i=0; i

copy_array[i] = (double *)malloc(sizeof(double) * output_w);

}

// calculate matrix a-b

for (i=0; i

for (j=0; j

copy_array[i][j] = data1[i+j*data1_h] - data2[i+j*data2_h];

}

}

//end calculating

//*******************************************************

plhs[0] = mxCreateDoubleMatrix(output_h,output_w, mxREAL);

y = mxGetPr(plhs[0]);

//copy the mid-data to the output pointer

for (i=0;i

for(j=0;j

*(y+i+j*output_h)=copy_array[i][j];

}

}

}

简单总结一下几个要点:

mex文件的编写可以分为三个步骤,数据传入,数据处理,数据导出

1、传入矩阵用mxGetPr,传入数值用mxGetScalar

2、获取2维矩阵维度用mxGetM,mxGetN,C模块无法同时获得3维矩阵的三个维度,维度需要自己手动传递

(此处有误,可以用函数mxGetDimensions: 就是返回一个指针ptr,每一个指针所指向的值是每一个维度的元素个数。例如有矩阵3*2的矩阵,那么*(ptr)为3,*(ptr+1)为2,如果是3维矩阵,只需要访问*(ptr+2)。参考文章中的第四节有详细描述)

3、数据在内存上都是连续的,访问的时候按列的顺序访问

4、数据传出用mxCreateDoubleMatrix,先创建一个double类型的指针用来存放要导出的数据,然后再拷贝到plhs[i]对应的指针上

最后

以上就是淡定外套为你收集整理的matlab mex c 例子,10分钟教会你简单的matlab和C/C++混合编程(mex文件)的全部内容,希望文章能够帮你解决matlab mex c 例子,10分钟教会你简单的matlab和C/C++混合编程(mex文件)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(68)

评论列表共有 0 条评论

立即
投稿
返回
顶部