混合编程目的
在Matlab中采用混合编程目的主要包括
- 利用已有的函数库,避免重复工作
- 加速计算,特别是减少循环所用时间
- 利用GPU等进行异构编程
混合编程方法—mex函数
目前已有的方法包括两种:(1)将c/Fortran源程序改写为mex函数,然后编译为二进制文件进行调用;(2)将c/Fortran源程序编译为动态链接库然后进行调用。在这两种方法中,前者计算速度更快,更适合混合编程方法。
mex函数是一类特殊的c/Fortran函数接口,编译后的二进制文件可以被matlab直接调用。
1.1.mex函数声明
首先看下mex函数声明格式
void mexFunction (int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
其中包含四个参数,其中nlhs
与nrhs
分别是输出参数与输入参数个数(Num of arguments on Left/Right Hand Side),plhs
与prhs
则是输入参数指针数组,mxArray
为 Matlab 中数据结构体,其声明包含在头文件mex.h
内。
1.2.mex函数参数调用
传入mex函数的参数都保存在mxArray
结构体数组内,在使用参数进行计算时,需首先将其转换为C语言对应类型。
常用几个获得参数函数包括:
double mxGetScalar(const mxArray *pm);
double *mxGetPr(const mxArray *pm);
其中pm为对应mxArray
类型的输入参数指针,如prhs[0]等。
- mxGetScalar
获取标量参数; - mxGetPr
获取向量/矩阵参数;
在使用mxGetPr
或mxGetScalar
函数获得输入参数对应的double类型指针之后,我们便可以直接对参数的值进行相应操作。需要注意的是,在Matlab中数组是按照列优先进行排列的,即是说当我们采用double类型指针*p指向一个[m x n]大小的矩阵时,p(i,j)对应的元素应为
p[(i-1)+(j-1)*m]
另外,在C函数中一般需要将矩阵维度也作为参数传入,但是在mex函数中,结构体mxArray
则包含了相应的矩阵维度信息,采用函数