[转帖]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 编辑 ] 楼上你好!刚刚因为论文需要计算接口,一直没有成功。现在向您请教。我是用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
望不吝赐教 从提示上看是缺少";"号 syntax error !!这个看看语法
页:
[1]