一个MEX程序示例

        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文件时,注意地址传递和值传递的方式,保证数据不能意外更改。






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值