声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 3199|回复: 3

[其他相关] [转帖]Mex程序简单示例

[复制链接]
发表于 2005-9-30 00:56 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

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
进行编译。

下面是实现我提到的目的的函数
  1. #include "mex.h"
  2. /*================================================*/
  3. /*  冒泡法计算向量中最大的N个元素     */
  4. /*             */
  5. /*  Author: WaitingForMe       */
  6. /*  Email:   [email=heroaq_2002@163.com]heroaq_2002@163.com[/email]     */
  7. /*  Blog:   [url=http://waitingforme.yculblog.com/][color=#000000]http://waitingforme.yculblog.com[/color][/url] */
  8. /*================================================*/

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

  10. void mexNMax(double y[], double x[], int N, int L)
  11. {
  12. int i=0;
  13. int j=0;
  14. double temp;
  15. for(j=0;j<N;j++)
  16. {
  17. for(i=0;i<L-j-1;i++)
  18. {
  19. if(x[i]>x[i+1])
  20. {
  21. temp=x[i+1];
  22. x[i+1]=x[i];
  23. x[i]=temp;
  24. }
  25. }
  26. }
  27. for(i=0;i<N;i++)
  28. {
  29. y[i]=x[L-1-i];
  30. }
  31. return;
  32. }

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

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

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

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

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

  60. /*检查返回最大个数是否比数组长度长,如果是就报错*/
  61. if(*N>L)
  62. mexErrMsgTxt("The number you want is greater than the length of input vector!");
  63. /*调用函数*/
  64. mexNMax(y, x, *N, L);
  65. return;
  66. }
复制代码

[ 本帖最后由 风花雪月 于 2008-8-10 09:31 编辑 ]
回复
分享到:

使用道具 举报

发表于 2008-6-22 20:49 | 显示全部楼层
楼上你好!刚刚因为论文需要计算接口,一直没有成功。现在向您请教。我是用MATLAB R2007a 调用v fortran6.5程序,按照书上写小的程序试验,总是出现这样的错误
mex fact.f90
Error fact.f90: 3  syntax error; found `mexfunction' expecting `;'
Error fact.f90: 4  extraneous old-style parameter list
Error fact.f90: 4  syntax error; found `integer' expecting `;'
Error fact.f90: 4  syntax error; found `plhs' expecting `;'
Error fact.f90: 4  syntax error; found `*' expecting `)'
Error fact.f90: 4  skipping `*'
Error fact.f90: 4  syntax error; found `*' expecting `)'
Error fact.f90: 4  skipping `*'
Error fact.f90: 5  syntax error; found `integer' expecting `;'
Error fact.f90: 5  syntax error; found `mxgetpr' expecting `;'
Error fact.f90: 6  syntax error; found `integer' expecting `;'
Error fact.f90: 6  syntax error; found `y_pr' expecting `;'
Error fact.f90: 7  syntax error; found `integer' expecting `;'
Error fact.f90: 7  syntax error; found `nlhs' expecting `;'
Error fact.f90: 8  syntax error; found `integer' expecting `;'
Error fact.f90: 8  syntax error; found `i' expecting `;'
Error fact.f90: 9  syntax error; found `real' expecting `;'
Error fact.f90: 9  syntax error; found `*' expecting `;'
Error fact.f90: 9  missing identifier
Error fact.f90: 9  syntax error; found `8' expecting `;'
Error fact.f90: 9  too 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 | 显示全部楼层
从提示上看是缺少";"号
发表于 2008-8-30 14:31 | 显示全部楼层
syntax error !!这个看看语法
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-13 11:28 , Processed in 0.061179 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表