📄 3.htm
字号:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>CTerm非常精华下载</title>
</head>
<body bgcolor="#FFFFFF">
<table border="0" width="100%" cellspacing="0" cellpadding="0" height="577">
<tr><td width="32%" rowspan="3" height="123"><img src="DDl_back.jpg" width="300" height="129" alt="DDl_back.jpg"></td><td width="30%" background="DDl_back2.jpg" height="35"><p align="center"><a href="http://sbbs.seu.edu.cn"><font face="黑体"><big><big>seu</big></big></font></a></td></tr>
<tr>
<td width="68%" background="DDl_back2.jpg" height="44"><big><big><font face="黑体"><p align="center"> 在matlab里面调用c (BM: luckzpz) </font></big></big></td></tr>
<tr>
<td width="68%" height="44" bgcolor="#000000"><font face="黑体"><big><big><p align="center"></big></big><a href="http://cterm.163.net"><img src="banner.gif" width="400" height="60" alt="banner.gif"border="0"></a></font></td>
</tr>
<tr><td width="100%" colspan="2" height="100" align="center" valign="top"><br><p align="center">[<a href="mex.htm">回到开始</a>][<a href="mex.htm">上一层</a>][<a href="4.htm">下一篇</a>]
<hr><p align="left"><small>发信人: babylon (淡蓝的晚间), 信区: MathTools <br>
标 题: 用c编写mex程序[part 3]--dodoo(转载) <br>
发信站: 虎踞龙蟠BBS站 (2000年06月03日20:28:49 星期六), 转信 <br>
<br>
【 以下文字转载自 Radio 讨论区 】 <br>
【 原文由 babylon 所发表 】 <br>
分析hello.c,可以看到程序的结构是十分简单的,整个程序由一个接口子过程 <br>
mexFunction构成。前面提到过,Matlab的mex函数有一定的接口规范,就是指这 <br>
nlhs:输出参数数目 <br>
plhs:指向输出参数的指针 <br>
nrhs:输入参数数目 <br>
prhs: 指向输入参数的指针 <br>
例如,使用 [a,b]=test(c,d,e) 调用mex函数test时,传给test的这四个参数分别是 <br>
2,plhs,3,prhs。其中: <br>
prhs[0]=c <br>
prhs[1]=d <br>
prhs[2]=e <br>
当函数返回时,将会把你放在plhs[0],plhs[1]里的地址赋给a和b,达到返回数据的目 <br>
的。 <br>
细心的你也许已经注意到,prhs[i]和plhs[i]都是指向类型mxArray类型数据的指针。 <br>
这个类型是在mex.h中定义的,事实上,在Matlab里大多数数据都是以这种类型存在。当 <br>
然还有其他的数据类型,可以参考Apiguide.pdf里的介绍。 <br>
为了让大家能更直观地了解参数传递的过程,我们把hello.c改写一下,使它能根据输 <br>
入参数的变化给出不同的屏幕输出: <br>
//hello.c 2.0 <br>
#include "mex.h" <br>
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) <br>
{ <br>
int i; <br>
i=mxGetScalar(prhs[0]); <br>
if(i==1) <br>
mexPrintf("hello,world!\n"); <br>
else <br>
mexPrintf("大家好!\n"); <br>
} <br>
将这个程序编译通过后,执行hello(1),屏幕上会打出: <br>
hello,world! <br>
而hello(0)将会得到: <br>
<br>
大家好! <br>
<br>
现在,程序hello已经可以根据输入参数来给出相应的屏幕输出。在这个程序里,除了用 <br>
到了屏幕输出函数mexPrintf(用法跟c里的printf函数几乎完全一样)外,还用到了一 <br>
个函数:mxGetScalar,调用方式如下: <br>
i=mxGetScalar(prhs[0]); <br>
<br>
"Scalar"就是标量的意思。在Matlab里数据都是以数组的形式存在的,mxGetScalar的 <br>
作用就是把通过prhs[0]传递进来的mxArray类型的指针指向的数据(标量)赋给C程序里 <br>
变量。这个变量本来应该是double类型的,通过强制类型转换赋给了整形变量i。 <br>
既然有标量,显然还应该有矢量,否则矩阵就没法传了。看下面的程序: <br>
//hello.c 2.1 <br>
#include "mex.h" <br>
void mexFunction(int nlhs, mxArray *plhs[], <br>
<br>
int nrhs, const mxArray *prhs[]) <br>
<br>
{ <br>
int *i;//这句话luckzpz认为应该改为double *i; <br>
<br>
i=mxGetPr(prhs[0]); <br>
if(i[0]==1) <br>
mexPrintf("hello,world!\n"); <br>
else <br>
mexPrintf("大家好!\n"); <br>
<br>
} <br>
这样,就通过mxGetPr函数从指向mxArray类型数据的prhs[0]获得了指向double类型的 <br>
指针。 <br>
但是,还有个问题,如果输入的不是单个的数据,而是向量或矩阵,那该怎么处理呢 <br>
通过mxGetPr只能得到指向这个矩阵的指针,如果我们不知道这个矩阵的确切大小,就 <br>
没法对它进行计算。 <br>
为了解决这个问题,Matlab提供了两个函数mxGetM和mxGetN来获得传进来参数的行数 <br>
和列数。下面例程的功能很简单,就是获得输入的矩阵,把它在屏幕上显示出来: <br>
<br>
//show.c 1.0 <br>
<br>
<br>
#include "mex.h" <br>
<br>
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) <br>
<br>
<br>
{ <br>
<br>
double *data; <br>
<br>
int M,N; <br>
<br>
int i,j; <br>
int i,j; <br>
<br>
<br>
<br>
data=mxGetPr(prhs[0]); //获得指向矩阵的指针 <br>
<br>
M=mxGetM(prhs[0]); //获得矩阵的行数 <br>
<br>
N=mxGetN(prhs[0]); //获得矩阵的列数 <br>
<br>
<br>
for(i=0;i<M;i++) <br>
<br>
{ <br>
<br>
for(j=0;j<N;j++) <br>
<br>
mexPrintf("%4.3f ",data[j*M+i]); <br>
<br>
mexPrintf("\n"); <br>
<br>
} <br>
<br>
} <br>
编译完成后,用下面的命令测试一下: <br>
a=1:10; <br>
b=[a;a+1]; <br>
show(a) <br>
show(b) <br>
需要注意的是,在Matlab里,矩阵第一行是从1开始的,而在C语言中,第一行的序数 <br>
为零,Matlab里的矩阵元素b(i,j)在传递到C中的一维数组大data后对应于data[j*M+i] <br>
。 <br>
<br>
<br>
-- <br>
DEADorALIVE <br>
<br>
※ 来源:.虎踞龙盘东南站 sbbs.seu.edu.cn.[FROM: 202.119.22.71] <br>
-- <br>
※ 转载:.虎踞龙蟠BBS站 sbbs.seu.edu.cn.[FROM: 202.119.22.102] <br>
</small><hr>
<p align="center">[<a href="mex.htm">回到开始</a>][<a href="mex.htm">上一层</a>][<a href="4.htm">下一篇</a>]
<p align="center"><a href="http://cterm.163.net">欢迎访问Cterm主页</a></p>
</table>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -