mex文件是由C或Fortran语言编写的源代码,经matlab编译器处理而产生的二进制文件。它可以被matlab解释器自动装载并执行的动态链接程序,类似windows下的dll文件。mex文件实现了C语言与matlab的接口,以下例子阐述该接口。
#include "mex.h"
#include <math.h>
double GetLogLike(int size, double* x, double* mu, double* sd){
for (int i = 0; i<size; i++){
sd[i] += 0.001;
}
double result = 0.0;
for (int i = 0; i<size; i++){
result += (-log(sd[i]) - ((x[i] - mu[i]) * (x[i] - mu[i]))/ (2 * (sd[i] * sd[i])));
}
return result;
}
void mexFunction ( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] ){
double *M0;
int m,n;
M0 = mxGetPr(prhs[0]);
m = mxGetM(prhs[0]);
n = mxGetN(prhs[0]);
double *M1;
M1 = mxGetPr(prhs[1]);
double *M2;
M2 = mxGetPr(prhs[2]);
plhs[0] = mxCreateDoubleMatrix(1,1,mxREAL); //生成1 x 1 的实矩阵,分配内存空间
double *A;
A = mxGetPr(plhs[0]);
*A = GetLogLike(n, M0, M1, M2);
}
头文件是#include "mex.h"
GetLoglike是计算似然的一个C函数。
mexFunction是接口函数,
void mexFunction ( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] )
返回类型:void
int nlhs:返回的参数的个数
mxArray *plhs[]:返回的参数对应的指针组成的数组
int nrhs:输入的参数的个数
const mxArray *prhs[]:输入的参数的对应的指针组成的数组
函数功能介绍:
mxGetpr(A), 得到数据A里存放的data的首地址
mxGetM(A), 得到数据A里存放的行值
mxGetN(A), 得到数据A里存放的列值
plhs[0] = mxCreateDoubleMatrix(m,n,mxREAL), 分配一个m*n的matlab矩阵,其地址赋给plhs[0]
*A = GetLogLike(n, M0, M1, M2);对相应的指针调用C函数进行计算。
以上是mex文件接口的解释和应用,在使用过程中注意参数传递类型:值传递和地址传递。上程序因为采用
了地址传递,所以对应的sd值在每次调用后值发生变化,而在用matlab函数实现该功能时sd值是采用值传递,
并不希望sd值变化,所以在编写mex文件时,注意地址传递和值传递的方式,保证数据不能意外更改。