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

📄 3.htm

📁 介绍了如何在matlab中调用C还是进行快速的运算
💻 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 + -