Mex程序简单示例

作者在 2008-08-30 14:34:50 发布以下内容


需要查询一个数组当中最大的几个值。

nmax(x,n) 找数组当中最大的n个元素
nthmax(x,n) 找数组当中第n大的元素
nmin(x,n) 找数组当中最小的n个元素
nthmin(x,n) 找数组当中第n小的元素

在n比较小的时候运算比使用matlab的函数快
找最大或者最小值的时候比使用max或者min函数快,原因估计是Matlab的max和min函数完成的功能不仅仅是找出最大最小值。

首先需要使用配置Matlab的编译器,我没有安装其他的编译器,就是用的Matlab的编译器。命令
mex -setup
然后就可以写C程序,完成以后使用
mex myfun.c
进行编译。

下面是实现我提到的目的的函数
复制内容到剪贴板
代码:
#include "mex.h"
/*================================================*/
/*  冒泡法计算向量中最大的N个元素     */
/*             */
/*  Author: WaitingForMe       */
/*  Email:   [email=heroaq_2002@163.com]heroaq_2002@163.com[/email]     */
/*  Blog:   [url=http://waitingforme.yculblog.com/][color=#000000]http://waitingforme.yculblog.com[/color][/url] */
/*================================================*/

/*计算程序,返回最大值的n个值,放在数组y当中,算法是冒泡法*/

void mexNMax(double y[], double x[], int N, int L)
{
int i=0;
int j=0;
double temp;
for(j=0;j<N;j++)
{
for(i=0;i<L-j-1;i++)
{
if(x[i]>x[i+1])
{
temp=x[i+1];
x[i+1]=x[i];
x[i]=temp;
}
}
}
for(i=0;i<N;i++)
{
y[i]=x[L-1-i];
}
return;
}

/*Mex接口函数,实现Matlab到C的输入输入变量的传递*/
/*void mexFunction(输出变量个数,输出变量指针,输入变量个数,输入变量指针)*/
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
double *x, *y, *N;
int L,mrows1,ncols1;

/*检查输入输入变量个数是否合法*/
if(nrhs!=2)
mexErrMsgTxt("Two input arguments required!");
else
if(nlhs>1)
mexErrMsgTxt("Too many output arguments");

/*检查输入输入变量类型是否合法*/
L=mxGetN(prhs[0]);
if(!mxIsDouble(prhs[0])||mxIsComplex(prhs[0])||L==1)
mexErrMsgTxt("The first input must be a col vector!");
mrows1=mxGetM(prhs[1]);
ncols1=mxGetN(prhs[1]);
if(!mxIsDouble(prhs[0])||mxIsComplex(prhs[0])||mrows1!=1||ncols1!=1)
mexErrMsgTxt("The second input argument must be an integer!");

/*获取输入变量的指针*/
x=mxGetPr(prhs[0]);
N=mxGetPr(prhs[1]);

/*建立输出矩阵变量*/
plhs[0]=mxCreateDoubleMatrix(1,*N,mxREAL);
/*将指针地址放在指针变量y当中*/
y=mxGetPr(plhs[0]);

/*检查返回最大个数是否比数组长度长,如果是就报错*/
if(*N>L)
mexErrMsgTxt("The number you want is greater than the length of input vector!");
/*调用函数*/
mexNMax(y, x, *N, L);
return;
}
未验证 | 阅读 6912 次
文章评论,共0条
游客请输入验证码
浏览1944758次