📄 c编写mex程序3.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程序<3> (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<M;i++)
{
for(j=0;j<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 + -