• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

VC 编译 MATLAB 的 mex 文件

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

VC 编译 MATLAB mex 文件
mex 文件是 MATLAB 调用其他程序设计语言程序或算法的接口。在 Windows 环境中,
mex 文件是扩展文件名为 DLL 的动态链接库,可以在 m 程序中直接调用,用户可以通过
234 MATLAB 实用教程
MATLAB 提供的命令“mex”将 C 程序编译成 mex 文件,实现 MATLAB 环境下直接调用或
链接这些程序。mex 文件必须在 C 语言编写后用“mex”命令编译生成,编写时按照 MATLAB
规定的格式和步骤进行,采用 mex 函数库中的函数与 MATLAB 进行交互,从 MATLAB 中获
取数据并返回信息。
本节在讲述 mex 文件系统设置、mex 函数和 mex 文件建立方法的基础上,通过实例说明
VC 编译 MATLAB mex 文件的方法。
11.5.1 mex 文件系统设置
编译和生成 mex 文件,需要安装 MATLAB 应用程序接口组件及 C 语言编译器。在
Windows 环境下编译 mex 文件,编译器必须支持 32 位的 Windows 动态链接库。第一次使用
mex 命令时必须通过命令窗口执行命令“mex –setup”进行适当配置,配置时第一个问题可
选“n”,编译器可选用“Microsoft Visual C/C++ version 6.0”。
11.5.2 mex 函数和 mex 文件
mex-函数是 MATLAB 外部程序的接口函数,以 mex 为前缀,用于实现 mex 文件与
MATLAB 的交互,mexFunction 函数是 mex 文件的核心。
MexFunction 的函数声明如下:
void mexFunction(int nlhs,mxArray *plhs[ ], int nrhs,const mxArray *prhs[ ])
其中,nlhs 为输出变量的个数;plhs 为指向输出变量指针的数组;nrhs 为输入变量的个
数;prhs 为指向输入变量指针的数组。mexFunction 函数中的参数声明是只读的,不能被修改,
MATLAB 调用 mex 程序时自动生成参数 nlhsplhsnrhs prhs
MATALB 中相应函数的调用格式为“[a,b,]=fun(c,d,)”,ab,… 为函数的输出变量,
cd,… 为函数的输入变量,此时 nlhs ab,… 变量的个数,nrhs cd,… 变量的
个数。例如,调用名为 engwm 的文件,可在 MATLAB 的命令行输入“[a,b,c]=engwm(x,y)”,
执行后 nrhs=2nlhs=3、并创建指针数组 prhs[0]-> xprhs[1]->y,这时输出变量还没有创建,
指针数组中 plhs[0]plhs[1]plhs[2]均指向 NULL
函数 mexErrMsgTxt 用于显示错误信息,显示完毕后立即终止当前运行的 mex 程序(这
与其他显示函数不同)。其他 mex 函数可参阅 MATLAB 的帮助文档。
下面通过编写显示字符串的程序,说明 mex 文件的建立和使用方法。
1)编写 C 语言程序代码
VC 中新建文件 good.cpp 并将其保存在指定目录中(如 E:\MEX),如图 11-22 所示。
good.cpp 的代码如下:
#include “mex.h”
void mexFunction(int nlhs,mxArray *plhs[ ],int nrhs, const mxArray *prhs[ ])
{
mexPrintf(“Good Morning!\n”);
}
这里,必须包含头文件 mex.h(该文件包含定义矩阵的头文件 matrix.h mex 函数的声
11 章 编译器与外部接口 235
明),mexPrintf 函数(只能用于 mex 程序)与 printf 函数的用法基本相同。

 


11-22 创建文件 good.cpp
2)编译 good.cpp
打开 MATLAB 平台并将工作目录改为 good.cpp 所在目录 E:\MEX,输入命令“mex
good.cpp”,则在目录 E:\MEX 下生成同名 DLL 程序 good.dll
3)执行 good.dll 程序
输入命令“good”将显示字符串“Good Morning”,如图 11-23 所示。

 


11-23 MEX 程序的编译和执行
上述源文件 good.cpp C++文件,也可用 C 文件 good.c 作为源文件(两文件代码相同)。
mex 编译生成 mex 文件时,命令改为“mex good.c”,good.c 所在目录中生成 good.dll,而
good.dll 的调用方法不变。
236 MATLAB 实用教程
11.5.3 VC 编译 mex 文件使用实例
前面通过 MATALB 命令“mex”编译了 mex 文件,如果 mex 程序比较复杂(例如需要
复杂界面窗口),应考虑使用 VC Project WizardClass Wizard 编译,下面用一个实例介绍。
1.设置 VC 的头文件搜索路径和库文件搜索路径
设置方法与 VC 调用 MATLAB 引擎时的设置相同,这里不再赘述。
2.建立工程
MFC AppWizard(dll)方式在指定目录下建立名为 Mexwm 的工程并选择静态链接。工
Mexwm 包含若干头文件和 Mexwm.cppMexwm.defMexwm.rcStdAfx.cpp 文件。
文件 Mexwm.def 中加入 mexFunction 函数,修改后的代码如下:
; Mexwm.def : Declares the module parameters for the DLL.
LIBRARY "Mexwm"
DESCRIPTION \'Mexwm Windows Dynamic Link Library\'
EXPORTS
; Explicit exports can go here
mexFunction
新建文件 circumference.cpp 并加入工程(文件功能是求圆周长),代码如下:
#include "stdafx.h"
#include "mex.h"
#include <math.h>
void circumference(double y[ ],double x[ ])
{
y[0]=x[0]*2*3.14;
return;
}
void mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[])
{
double *x; double *y; CString str;
//检查变量个数
if(nrhs!=1)
{
mexErrMsgTxt("输入变量只能为 1 个!");
}
else if(nlhs!=1)
{
mexErrMsgTxt("输出变量只能为 1 个!");
}
plhs[0]=mxCreateDoubleMatrix(1,1,mxREAL); //创建输出变量矩阵
y=mxGetPr(plhs[0]); //赋输出变量的数据指针给 y
x=mxGetPr(prhs[0]); //赋输入变量的数据指针给 x
//调用计算程序
circumference(y,x);
str.Format("圆周为%3.2f",*y);
11 章 编译器与外部接口 237
AfxMessageBox(str);
}
3.设置工程选项
选择菜单【Project】中的【settings】打开工程设置对话框,在 Link 选项卡的【对象/
模块】文本框输入库文件名 libmx.lib libmex.lib libmat.lib(见图 11-24),在【C/C++】选项卡
的【Preprocessor definitions field】文本框中输入 MATLAB_MEX_FILE(见图 11-25)。设置
完毕并编译连接之后,工程所在目录下 debug 文件夹中生成动态连接库 Mexwm.dll

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
DBGrid、DBGrideh专题总结(来自delphi园地)发布时间:2022-07-18
下一篇:
delphi中var关键字发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap