首页 | 混沌序列分析 | 支持向量机 | MATLAB资料 | Visual C++ | 其它网络资源 | 友情链接 | 给我留言 
 
 
 

中文版火狐浏览器
远离木马和流氓软件
点下面图标下载

 

 

如何在 VC++6.0 环境中编译与调试 mex 程序

作者:陆振波
单位:海军工程大学
电子邮件: luzhenbo@yahoo.com.cn
个人主页: http://luzhenbo.88uu.com.cn/

 

1 、编写 Matlab 函数

函数文件 sum_prod.m ,内容如下:

function [sum,prod] = sum_prod(p1,p2)

sum = p1+p2; % p1 与 p2 的和

prod = p1.*p2; % p1 与 p2 的点乘

该函数完成的是矩阵的求和与点乘的功能,下面将介绍把该代码转换成 C++ 环境可用的代码的方法。

 

2 、 Matlab6.5 编译器设置

(1) 在同一台电脑上安装 Matlab6.5 和 Visual C++6.0

(2) mex 命令设置

(a) 运行 Matlab ,在 Matlab 的命令窗口 (Command Window) 键入“ mex -setup ”命令后,按回车键,安装 Matlab 编译器;

(b) 命令窗口出现如下提示:

Please choose your compiler for building external interface (MEX) files:

Would you like mex to locate installed compilers [y]/n?

此时键入 ”y” ,按回车;

(c) 命令窗口出现如下提示:

Please choose your compiler for building external interface (MEX) files:

Would you like mex to locate installed compilers [y]/n? y

Select a compiler:

[1] Digital Visual Fortran version 6.0 in C:\Program Files\Microsoft Visual Studio

[2] Lcc C version 2.4 in C:\MATLAB6P5\sys\lcc

[3] Microsoft Visual C/C++ version 6.0 in C:\Program Files\Microsoft Visual Studio

[0] None

此时键入 ” 3” ,按回车;选择 Microsoft Visual C++6.0 的编译器

(d) 命令窗口出现如下提示:

Please verify your choices:

Compiler: Microsoft Visual C/C++ 6.0

Location: C:\Program Files\Microsoft Visual Studio

Are these correct?([y]/n):

此时键入 ”y” ,按回车;确认选择 Microsoft Visual C++6.0 的编译器

(3) mbuild 命令设置

(a) 运行 Matlab ,在 Matlab 的命令窗口 (Command Window) 键入“ mbuild -setup ”命令后,按回车键,安装 Matlab 编译器;

(b) 命令窗口出现如下提示:

Please choose your compiler for building standalone MATLAB applications:

Would you like mbuild to locate installed compilers [y]/n?

此时键入 ”y” ,按回车;

(c) 命令窗口出现如下提示:

[1] Lcc C version 2.4 in C:\MATLAB6P5\sys\lcc

[2] Microsoft Visual C/C++ version 6.0 in C:\Program Files\Microsoft Visual Studio

[0] None

此时键入 ” 2” ,按回车;选择 Microsoft Visual C++6.0 的编译器

(d) 命令窗口出现如下提示:

Please verify your choices:

Compiler: Microsoft Visual C/C++ 6.0

Location: C:\Program Files\Microsoft Visual Studio

Are these correct?([y]/n):

此时键入 ”y” ,按回车;确认选择 Microsoft Visual C++6.0 的编译器

(4) 在 Matlab 的命令窗口 (Command Window) 键入“ cd(prefdir); mccsavepath prefdir; 启动 MATLAB add-in 工具条

 

3 、建立 MFC 动态链接工程

(1) 建立一个名为 sum_prod 的 MFC 动态链接工程 ,如下图所示

(2) 单击 OK 按钮,出现如下对话框,选择使用 静态链接 MFC 的 DLL ,如下图如示,其它采用默认设置。

(3) 在 Sample 目录下会生成 sum_prod.cpp 和 sum_prod.def 这两个文件。

 

4 、 VC++6.0 环境及工程设置

在上面的 VC 工程中,进行以下设置

(1) VC++6.0 环境设置

单击菜单 Tools ,出现如下菜单

单击 Options… 菜单项,出现 Options 对话框,选择 Directories 标签,在 include files 里面加入:

C:\MATLAB6P5\EXTERN\INCLUDE

如下图所示

在 Library files 里面加入:

C:\MATLAB6P5\EXTERN\LIB\WIN32\MICROSOFT\MSVC60

如下图所示

 

(2) VC++6.0 工程设置

单击菜单 Project ,出现如下菜单

单击 Setting… 菜单项,出现 Project Setting 对话框,选择 Link 标签,在 Object/library modules: 下面的文本框内容的后面加入 libmx.lib libmex.lib libmatlbmx.lib libmat.lib ,如下图所示

设置完成。

 

5 、添加 mexFunction 函数代码

(1) 打开 sum_prod.def 文件,在“ EXPORTS ”后面加入 mexFunction 一行 ,声明 mexFunction 函数为导出函数,下面是编辑后的 sum_prod.def 文件内容

(2) 打开 sum_prod.cpp 文件,在该文件尾部添加 mexFunction 函数代码 。也可以将 mexFunction 函数代码用另外一个 cpp 文件保存,在每个文件的开始应加上这一行

#include "stdafx.h"

(3) 与第 1 步 Maltab 函数相对应的 mexFunction 函数代码如下:

 

#include "mex.h" // mx,mex 函数头文件

 

// 定义输入参数

#define P1 prhs[0]

#define P2 prhs[1]

 

// 定义输出参数

#define SUM plhs[0]

#define PROD plhs[1]

 

// 定义 C 运算函数

void SUM_PROD_RUN(double *sum,

double *prod,

double *p1,

double *p2,

int m1,

int n1)

{

// C 源程序代码

int i;

 

for (i=0;i<m1*n1;i++)

{

sum[i] = p1[i]+p2[i];

prod[i] = p1[i]*p2[i];

}

}

 

void

mexFunction (int nlhs, mxArray *plhs[], // 输出参数个数,及输出参数数组

int nrhs, const mxArray *prhs[]) // 输入参数个数,及输入参数数组

{

int m1,n1,m2,n2;

double *p1,*p2,*sum,*prod;

 

// 取得输出矩阵的行列数

m1 = mxGetM(P1);

n1 = mxGetN(P1);

m2 = mxGetM(P2);

n2 = mxGetN(P2);

 

// 输入矩阵的行列数必须相等

if (m1!=m2||n1!=n2)

mexErrMsgTxt("The size of input matrix must be equal!\n");

 

// 为输出变量分配内存空间

SUM = mxCreateDoubleMatrix(m1,n1,mxREAL);

PROD = mxCreateDoubleMatrix(m1,n1,mxREAL);

 

// 取得输入参数指针

p1 = mxGetPr(P1);

p2 = mxGetPr(P2);

// 取得输出参数指针

sum = mxGetPr(SUM);

prod = mxGetPr(PROD);

 

// 调用 C 运算函数

SUM_PROD_RUN(sum,prod,p1,p2,m1,n1);

return;

}

(4) 编译链接程序后,可以在 Debug 目录得到 sum_prod.dll ,该 DLL 就是 Matlab 环境中可直接调用的 C 语言 mex 函数

 

6 、 mexFunction 函数调试

(1) 在 VC++6.0 中以 Debug 方式建立以上 sum_prod 工程

(2) 单击菜单 Project ,出现如下菜单

单击 Setting… 菜单项,出现 Project Setting 对话框,选择 Debug 标签, 在 Executable for debug session: 下面的文本框内容的后面加入 matlab.exe 的完整路径名 ,如下 图所示

接 OK 按钮。

(3) 在 mexFunction 源程序中合适的 设置断点,然后按 F5 键进入调试过程 。

(4) 进入调试过程后,就会启动 一个新的 Matlab 程序,这个 Matlab 程序的当前目录为该工程所在的位置,为了运行 sum_prod.dll ,需要 将当前目录设置为 Debug 目录 。

(5) 在 Matlab 命令窗口调用 sum_prod.dll ,程序就会停在 VC++6.0 环境里的程序断点处。此时可以 在 Context 窗口中看到最近处理的变量数值 ,并可以 随意添加 Watch 。这样就可以像调试通常的 C 程序一样对 mex 程序进行调试,如下图所示。

 

7 、 mexFunction 函数测试

(1) 运行 Matlab6.5 ,将 sum_prod.dll 复制到 Matlab 当前目录

(2) 在 Matlab6.5 命令窗口输入以下代码

“ p1=[1 2;3 4];p2=[5 6;7 8];[sum,prod]=sum_prod(p1,p2) ”

按回车键,得到

sum =

6 8

10 12

prod =

5 12

21 32

表明 sum_prod.dll 测试成功!

 

 

其它相关主题:

MATLAB与C++的接口问题 - mex.mat.引擎

MATLAB与VC混编-Matcom篇

Vc++下如何利用MATLAB工具箱进行数字信号处理

数学工具常见问题集

提高MATLAB运行速度和节省空间的心得合集

完整MATLAB程序下载

我与MATLAB这三年

  首页 | 混沌序列分析 | 支持向量机 | MATLAB资料 | Visual C++ | 其它网络资源 | 友情链接 | 给我留言