马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?我要加入
x
需要查询一个数组当中最大的几个值。
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;
- }
复制代码
[ 本帖最后由 风花雪月 于 2008-8-10 09:31 编辑 ] |