没有合适的资源?快使用搜索试试~ 我知道了~
MATLAB之应用程序接口
资源推荐
资源详情
资源评论
第1章 应用程序接口
MATLAB 虽然是一个完整的科学计算与可视化的环境,但在很多情况下它仍需与其他外部程序
沟通,可用 MATLAB 提供的应用程序接口(Application Program Interface,简称 API) 来实现此
功能。
MATLAB 应用程序接口包括 3 部分内容,分别为 MEX 文件——外部程序调用接口,在
MATLAB 中调用 C 语言或者 Fortran 语言编写的程序,以提高数据处理的效率;MAT 文件应用程
序——数据输入输出接口,向 MATLAB 环境传送数据或从 MATLAB 环境接收数据,即实现
MATLAB 系统与外部环境的数据交换;MATLAB 计算引擎函数库——在 MATLAB 和其他应
用程序间建立客户机/服务器关系,将 MATLAB 作为一个计算引擎,在其他应用程序中调用,
从而降低程序设计的工作量。MATLAB 在 Windows 平台上支持 Microsoft 提出的
COM 标准,同时支持 Java 语言,所以 MATLAB 几乎可以同 Windows 平台上任何一种软件或
者开发语言进行交互。
本章将重点讨论这些应用程序接口的实现方法。
15.1 创建 C 语言 MEX 文件
本节将介绍在 MATLAB 中创建 C 语言的 MEX 文件的方法,在这之前,首先对 MEX 文件作
一个简要的介绍。
15.1.1
MEX 文件简介
MEX 从字面上是 MATLAB 和 Executable 两个单词的缩写。一般 MEX 文件使用 C 语言或
者 Fortran 语言进行开发,通过适当的编译后,生成的目标文件能够被 M 语言解释器调用执
行,这种文件在 Microsoft Windows 下使用后缀.dll。MEX 文件重要应用于已存在较大规模的
C 和 Fortran 程序,可以比较容易的在 MATLAB 中调用或是在 MATLAB 中运行不很有效,存
在计算瓶颈或是直接面向硬件编写的 C 和 Fortran 程序可以通过 MEX 文件被
MATLAB 调用。
“阵列”是 MATLAB 惟一能处理的对象,在 C 语言中,MATLAB“阵列”用结构体 mxArray
定义。
下面通过一个最简单的 MEX 文件示例来认识 MEX 源文件的结构。
【例 15.1】简单 MEX 文件示例——mexhello.c
示例代码设置如下:
/*necessary header file*/
#include "mex.h"
MATLAB 7.0
这是标准的 C 语言源文件,其程序的基本语法完全是 ANSI C 的语法结构。首先是头文件的
包含语句,所有的源文件中必须包含 mex.h,它完成了所有 C 语言 MEX 函数的原型声明,还包
含了 matrix.h 文件,即对 mx 函数和数据类型的声明和定义。
接下来是 C 语言 MEX 源文件的入口函数部分,这也是必需的部分,并且书写形式固定。括号里
的 4 个变量分别表示输入参数的个数、输入参数、输出参数的个数和输出参数。
需要注意的是,MATLAB 7.0 的 MEX 源文件中不能包括任何汉字,否则会出现编译连
接错误。
上述 MEX 源文件编写完毕后,保存在 MATLAB 的当前工作路径下,名称为 mexhello.c, 接着
在命令窗口键入以下指令:
>> mex mexhello.c
此命令对 MEX 文件进行编译,创建出 MATLAB 的 MEX 文件,可以在 MATLAB 命令
行中运行下面的语句:
需要注意的是 MATLAB 本身是一个高效的系统,编程简单,效率高,不到万不得已,
建议不要使用 MEX 手段。
15.1.2
编写 C MEX 文件
编写 MEX 文件源程序时,要用到两类 API 库函数,即 mx-库函数和 mex-库函数,前者用于
在 C 语言中创建、访问、操作和删除结构体 mxArray,后者用于与 MATLAB 环境进行交互。有
关这些库函数的详细说明可参看 MATLAB 的 help 文件。
下面通过一个实例来演示 C MEX 的编写过程。
【例 15.2】生成随机数——执行 MATLAB 函数
示例代码设置如下:
–512–
/*entrance function of MEX function*/
void mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[])
{
/*content of function ,transfer other function*/
mexPrintf("Hello world!");
}
>> mexhello
Hello world!
注意:上述编译过程也可以在命令行提示符窗口中完成。
/*MEX function example,create random numbers——randomnum.c*/
#include "mex.h"
/*MEX function entrance*/
void mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[])
{
double *m,*n,*flag;
/*error detecting*/
MATLAB 7.0
本例的源程序中使用 mexCallMATLAB 函数调用了 MATLAB 的随机数产生函数 rand。
mexCallMATLAB 函数的定义如下:
int mexCallMATLAB(int nlhs,mxArray *plhs[],int nrhs,msArray *prhs[],const char *command_name);
其中前 4 个参数为需要输入到被调用函数中的输入、输出参数,而最后一个参数为被调用的
函数名称。当执行 command_name 函数出现错误时,根据 mexSetTrapFlag 函数的设置进行错误
处理,其定义如下:
void mexSetTrapFlag(int trap_flag);
若输入参数为 0,则将程序的控制权交给 MATLAB,退出 MEX 函数的执行,若输入参数为
1,则将程序的控制权交给 MEX 函数,继续执行 MEX 函数。例子中的第一次 MATLAB 调用是错误
的,不存在 rnd 函数,程序如何执行将决定于 flag 值的设定。
编译并执行 randomnum.c,代码设置如下:
不同的实例将会用到不同的 mex 函数,有关其他 mex 函数的使用,用户可以参看 help
说明和其他专门资料的例程。
此外,MEX 文件还可用 Visual Studio 来创建,适合习惯利用集成开发环境的程序员使用。
–513–
if(nlhs>1||nrhs!=3)
mexErrMsgTxt("error:wrong numbers of input/output!");
m=mxGetPr(prhs[0]);
n=mxGetPr(prhs[1]);
flag=mxGetPr(prhs[2]);
plhs[0]=mxCreateDoubleMatrix(*m,*n,mxREAL);
/*set output flag*/
mexSetTrapFlag(*flag);
/*wrong transfer-->function rnd does not exsit*/
mexCallMATLAB(1,plhs,2,prhs,"rnd");
/*continue to run MEX function file so rand function is transfered by MEX file*/
mexPrintf("user set Flag to 1.\n");
/*rright transfer*/
mexCallMATLAB(1,plhs,2,prhs,"rand");
}
0.4860
0.8913
0.7621
0.9501
0.2311
0.6068
>> mex randomnum.c
>> y=randomnum(3,2,0) %flag 为 0
??? Undefined command/function 'rnd'.
%调用不成功,再次运行,flag 设为 1
>> y=randomnum(3,2,1)
??? Undefined command/function 'rnd'.
user set Flag to 1.
y =
MATLAB 7.0
15.2 创建 Fortran 语言 MEX 文件
使用 Fortran 语言创建 MEX 文件的方法和过程与创建 C 语言 MEX 文件的方法和过程几乎一
样,无非是使用的高级编程语言有所不同而已。Fortran 语言在科学计算方面的应用比 C 语言要广
泛,它的数值稳定性和多种数值变量是 C 语言无法匹敌的。
本节主要介绍 Fortran 语言 MEX 文件的创建。
15.2.1
Fortran 语言 MEX 文件简介
以一个简单的例程介绍 Fortran 语言 MEX 文件。
【例 15.3】简单的 Fortran 语言 MEX 文件——mexhello.c
它的功能也是在 MATLAB 命令窗口输出一段文字。在 M 文件编辑器中输入完毕后,保
存在当前工作目录下,名称为 mexhello.f。然后编译运行:
与 C MEX 类似,首先是入口函数的声明部分(没有了头文件的包含语句),输入参数和输出
参数的含义与 C 相同,然后是源程序的主体部分,进行数据的存取和内存的分配,调用相应的计算
子程序或者函数。程序的结尾是 Fortran 的特别要求,必须有 return 和 end 关键字作为结束。
MATLAB 的数据在 C 中使用 mxArray 数据类型来表示,但是在 Fortran 中没有显性的定义
该数据结构,而是通过一种所谓的“指针”类型数据完成 Fortran 和 MATLAB 之间的数据传递。
MATLAB 将 需 要传 递 的 mxArray 数据指针保存为一个整数类型的变量,例如在
mexFunction 入口函数中声明的 prhs 和 plhs,然后在 Fortran 程序中,通过能够访问指针的
Fortran 语言 mx 函数访问 mxArray 数据,获取其中的实际数据。
–514–
C entrance function
subroutine mexFunction(nlhs,plhs,nrhs,prhs)
C ------------------------------------------
C parameters defination
integer plhs(*),prhs(*)
integer nlhs,nrhs
C code
call mexPrintf('Hello MATLAB World!')
C end of file
return
end
>> mex mexhello.f
>> mexhello
Hello MATLAB World!
注意:在进行编译之前,一定要在 MATLAB 环境下完成 MEX 文件编译器的配置,本书例程中所使用的
Fortran 开发环境是 Compaq Visual Fortran。
剩余20页未读,继续阅读
资源评论
蚁库
- 粉丝: 31
- 资源: 99
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功