gghhjj 发表于 2005-9-30 00:56

[转帖]Mex程序简单示例

需要查询一个数组当中最大的几个值。
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:   heroaq_2002@163.com   */
/*Blog:   http://waitingforme.yculblog.com */
/*================================================*/

/*计算程序,返回最大值的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>x)
{
temp=x;
x=x;
x=temp;
}
}
}
for(i=0;i<N;i++)
{
y=x;
}
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);
if(!mxIsDouble(prhs)||mxIsComplex(prhs)||L==1)
mexErrMsgTxt("The first input must be a col vector!");
mrows1=mxGetM(prhs);
ncols1=mxGetN(prhs);
if(!mxIsDouble(prhs)||mxIsComplex(prhs)||mrows1!=1||ncols1!=1)
mexErrMsgTxt("The second input argument must be an integer!");

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

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

/*检查返回最大个数是否比数组长度长,如果是就报错*/
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 编辑 ]

ansenyue 发表于 2008-6-22 20:49

楼上你好!刚刚因为论文需要计算接口,一直没有成功。现在向您请教。我是用MATLAB R2007a 调用v fortran6.5程序,按照书上写小的程序试验,总是出现这样的错误
mex fact.f90
Error fact.f90: 3syntax error; found `mexfunction' expecting `;'
Error fact.f90: 4extraneous old-style parameter list
Error fact.f90: 4syntax error; found `integer' expecting `;'
Error fact.f90: 4syntax error; found `plhs' expecting `;'
Error fact.f90: 4syntax error; found `*' expecting `)'
Error fact.f90: 4skipping `*'
Error fact.f90: 4syntax error; found `*' expecting `)'
Error fact.f90: 4skipping `*'
Error fact.f90: 5syntax error; found `integer' expecting `;'
Error fact.f90: 5syntax error; found `mxgetpr' expecting `;'
Error fact.f90: 6syntax error; found `integer' expecting `;'
Error fact.f90: 6syntax error; found `y_pr' expecting `;'
Error fact.f90: 7syntax error; found `integer' expecting `;'
Error fact.f90: 7syntax error; found `nlhs' expecting `;'
Error fact.f90: 8syntax error; found `integer' expecting `;'
Error fact.f90: 8syntax error; found `i' expecting `;'
Error fact.f90: 9syntax error; found `real' expecting `;'
Error fact.f90: 9syntax error; found `*' expecting `;'
Error fact.f90: 9missing identifier
Error fact.f90: 9syntax error; found `8' expecting `;'
Error fact.f90: 9too many errors
C:\PROGRA~1\MATLAB\R2007A\BIN\MEX.PL: Error: Compile of 'fact.f90' failed.
??? Error using ==> mex at 206
Unable to complete successfully.

我用的是matlab自带的编译器,编译C例子程序已经成功,就是fortran总是类似错误。
源程序是:
       subroutine mexfunction(nlhs,plhs,nrhs,prhs)
         integer plhs(*),prhs(*)
         integer mxgetpr,mxcreatedoublematrix
         integer y_pr
         integer nlhs,nrhs
         integer i
         real*8 x,y,mxgetscalar
         x=mxgetscalar(prhs(1))
      prhs(1)=mxcreatedoublematrix(1,1,0)
      y_pr=mxgetpr(plhs(1))
                y=1.0
                do i=x,1,-1
                y=y*i
                end do
                call mxcopyreal8toptr(y,y_pr,1)
                return
                end
望不吝赐教

风花雪月 发表于 2008-8-10 09:40

从提示上看是缺少";"号

graduate 发表于 2008-8-30 14:31

syntax error !!这个看看语法
页: [1]
查看完整版本: [转帖]Mex程序简单示例