⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 c编写mex程序3.htm

📁 VC与Matlab混合编程文章.
💻 HTM
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0113)http://bbs.sjtu.edu.cn/cgi-bin/bbsanc?path=/groups/GROUP_4/MathTools/DA6B7A1FF/D9BB618C8/D47AB10D3/M.1025941402.A -->
<HTML><HEAD><TITLE>SJTUBBS精华区文章</TITLE>
<META content="text/html; charset=gb2312" http-equiv=Content-Type><LINK 
href="c编写mex程序3.files/bbstyle.css" rel=stylesheet type=text/css>
<META content="MSHTML 5.00.3315.2870" name=GENERATOR></HEAD>
<BODY>
<CENTER>
<TABLE class=title width="90%">
  <TBODY>
  <TR>
    <TH align=left class=title width="33%">文章阅读</TH>
    <TH align=middle class=title width="33%">饮水思源</TH>
    <TH align=right class=title width="34%">精华区</TH></TR></TBODY></TABLE>
<HR>

<TABLE class=doc>
  <TBODY>
  <TR>
    <TD class=doc><PRE>发信人: GzLi (苍鹰-文子), 信区: MathTools
标  题: c编写mex程序&lt;3&gt; (zz)
发信站: 饮水思源 (2002年07月06日15:43:26 星期六), 站内信件

发信人: dodoo (虚怀), 信区: Programming 
标  题: 用C编写mex程序  [PART 3] 
  分析hello.c,可以看到程序的结构是十分简单的,整个程序由一个接口子过程 
mexFunction构成。前面提到过,Matlab的mex函数有一定的接口规范,就是指这 
nlhs:输出参数数目 
plhs:指向输出参数的指针 
nrhs:输入参数数目 
例如,使用 [a,b]=test(c,d,e) 调用mex函数test时,传给test的这四个参数分别是
2, 
plhs,3,prhs。其中: 
prhs[0]=c 
 
prhs[1]=d 
 
prhs[2]=e 
 
当函数返回时,将会把你放在plhs[0],plhs[1]里的地址赋给a和b,达到返回数据的
 
的。 
 
 
  细心的你也许已经注意到,prhs[i]和plhs[i]都是指向类型mxArray类型数据的指
针。 
 
这个类型是在mex.h中定义的,事实上,在Matlab里大多数数据都是以这种类型存在
。当 
 
然还有其他的数据类型,可以参考Apiguide.pdf里的介绍。 
 
 
  为了让大家能更直观地了解参数传递的过程,我们把hello.c改写一下,使它能根
据输 
 
入参数的变化给出不同的屏幕输出: 
 
 
//hello.c 2.0 
 
 
#include "mex.h" 
 
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs
[]) 
 
{ 
 
 int i; 
 
 i=mxGetScalar(prhs[0]); 
 
 if(i==1) 
 
  mexPrintf("hello,world!\n"); 
 
 else 
 
  mexPrintf("大家好!\n"); 
 
} 
 
 
  将这个程序编译通过后,执行hello(1),屏幕上会打出: 
 
hello,world! 
 
  而hello(0)将会得到: 
 
大家好! 
 
 
现在,程序hello已经可以根据输入参数来给出相应的屏幕输出。在这个程序里,除
了用 
 
到了屏幕输出函数mexPrintf(用法跟c里的printf函数几乎完全一样)外,还用到了
 
个函数:mxGetScalar,调用方式如下: 
 
i=mxGetScalar(prhs[0]); 
 
  "Scalar"就是标量的意思。在Matlab里数据都是以数组的形式存在的,mxGetScalar
 
作用就是把通过prhs[0]传递进来的mxArray类型的指针指向的数据(标量)赋给C程
序里 
 
的变量。这个变量本来应该是double类型的,通过强制类型转换赋给了整形变量i。
 
 
 
  既然有标量,显然还应该有矢量,否则矩阵就没法传了。看下面的程序: 
 
 
//hello.c 2.1 
 
 
#include "mex.h" 
 
void mexFunction(int nlhs, mxArray *plhs[], 
 
     int nrhs, const mxArray *prhs[]) 
 
{ 
 
 int *i; 
 
 i=mxGetPr(prhs[0]); 
 
 if(i[0]==1) 
 
  mexPrintf("hello,world!\n"); 
 
 else 
 
  mexPrintf("大家好!\n"); 
 
} 
 
 
  这样,就通过mxGetPr函数从指向mxArray类型数据的prhs[0]获得了指向double类
型的 
 
指针。 
 
 
  但是,还有个问题,如果输入的不是单个的数据,而是向量或矩阵,那该怎么处理
 
?通过mxGetPr只能得到指向这个矩阵的指针,如果我们不知道这个矩阵的确切大小
,就 
 
没法对它进行计算。 
 
 
  为了解决这个问题,Matlab提供了两个函数mxGetM和mxGetN来获得传进来参数的行
 
和列数。下面例程的功能很简单,就是获得输入的矩阵,把它在屏幕上显示出来: 

 
//show.c 1.0 
 
 
#include "mex.h" 
 
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs
[]) 
 
 
{ 
 
 double *data; 
 
 int M,N; 
 
 int i,j; 
 
 
 
 data=mxGetPr(prhs[0]); //获得指向矩阵的指针 
 
 M=mxGetM(prhs[0]); //获得矩阵的行数 
 
 N=mxGetN(prhs[0]); //获得矩阵的列数 
 
 
 for(i=0;i&lt;M;i++) 
 
 { 
 
  for(j=0;j&lt;N;j++) 
 
   mexPrintf("%4.3f  ",data[j*M+i]); 
 
  mexPrintf("\n"); 
 
 } 
 
} 
 
 
  编译完成后,用下面的命令测试一下: 
 
 
  a=1:10; 
 
  b=[a;a+1]; 
 
  show(a) 
 
  show(b) 
 
 
  需要注意的是,在Matlab里,矩阵第一行是从1开始的,而在C语言中,第一行的序
 
为零,Matlab里的矩阵元素b(i,j)在传递到C中的一维数组大data后对应于data[j*M
+i] 
 
 
 
-- 
 
※ 来源: 心网 cag.seu.edu.cn [FROM: 202.119.30.69] 

--
她总是警告我说:如果你不学习,你将什么都不是。绝对什么都不是。
                学习没有任何捷径可言。不要欺骗你自己。
welcome to <B><FONT class=col31>Matlab</FONT></B> http://bbs.sjtu.edu.cn/cgi-bin/bbsdoc?board=Matlab
welcome to <B><FONT class=col32>DataMining</FONT></B>  http://DataMining.bbs.lilybbs.net
<B><FONT class=col36>※ 修改:·GzLi 於 07月06日15:44:46 修改本文·[FROM: 211.80.38.29]</FONT></B>
<FONT class=col31>※ 来源:·饮水思源 bbs.sjtu.edu.cn·[FROM: 211.80.38.29] </FONT>
</PRE></TR></TBODY></TABLE>
<HR>

<TABLE class=foot>
  <TBODY>
  <TR>
    <TH class=foot><A href="http://bbs.sjtu.edu.cn/">返回首页</A></TH>
    <TH class=foot><A 
href="http://bbs.sjtu.edu.cn/cgi-bin/bbssec">分类讨论区</A></TH>
    <TH class=foot><A 
  href="http://bbs.sjtu.edu.cn/cgi-bin/bbsall">全部讨论区</A></TH></TR></TBODY></TABLE></CENTER></BODY></HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -