matlab与vc混合编程(绝对无误)

matlab与vc混合编程(绝对无误)
matlab与vc混合编程(绝对无误)

matlab与vc混合编程

1、环境设置

在桌面上右键单击“我的电脑”图标出现以下菜单

单击“属性”菜单项,出现“系统特性”对话框,单击“高级”选项卡,如下图所示

在上图中,单击“环境变量”按钮,出现“环境变量”对话框,添加系统变量 matlab 值为 D:\MATLAB 即 matlab 的安装路径,如下图所示

在环境变量 path 中加入 D:\MATLAB\bin\win32 ,如下图所示

按“确定”完成设置后,重启计算机或注销当前用户,即可应用新设置。

2、matlab 编译器设置

(1) mex 命令设置

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

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

mex -setup

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

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

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

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

Select a compiler:

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

[2] Lcc C version 2.4.1 in D:\MA TLAB\sys\lcc

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

[4] Open WA TCOM C/C++ version 1.3 in D:\Maple11

[0] None

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

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

Please verify your choices:

Compiler: Microsoft V isual C/C++ 6.0

Location: C:\Program Files\Microsoft V isual Studio

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

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

(2) mbuild 命令设置

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

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

mbuild -setup

Please choose your compiler for building standalone MA TLAB applications:

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

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

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

Select a compiler:

[1] Lcc C version 2.4.1 in D:\MATLAB\sys\lcc

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

[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 的编译器,编译器设置完成。

3、编写matlab 函数

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

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

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

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

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

4、将matlab 函数转成dll 文件

在 Matlab7.0 的 Command Window 下输入命令 :

命令: mcc -W lib:libsum_prod -T link:lib sum_prod.m –v

其中libsum_prod是需要生成的各种文件的名称,sum_prod.m为matlab函数。生成动态链接库 dll ,编译完成后, matlab 生成一些文件,其中

libsum_prod.ctf

libsum_prod.dll

libsum_prod.h

libsum_prod.lib

这些文件是我们后面需要用到的。

注意:该命令生成的 dll 文件接口的数据类型是 mxArray

5、VC++6.0 工程的创建与设置

(1)建立一个名为 Test 基于 MFC的单文档应用程序

添加一个新的菜单项及其子菜单

按Ctrl+W快捷键,在MFC ClassWizard中为资源ID_SUMPROD配置消息COMMAND(注意是在CMainFrame类中), 选择ADD FUNCTION,点击OK,出现OnSumprod()成员函数。

在资源视图中,插入新的对话框,添加如下的对话框,其中“运算”为删掉OK按钮后的新控件,并在MFC ClassWizard为“运算”添加响应函数OnCalculate()。

建立以该对话框为资源的对话框类,命名为CCalculate,并为各编辑框控件映射成员变量。

在MainFrm.cpp文件添加头文件#include "Calculate.h",并为OnSumprod()成员函数添加代码

void CMainFrame::OnSumprod()

{

// TODO: Add your command handler code here

CCalculate dlg;

dlg.DoModal();

}

(2)对 VC ++ 6.0 ,进行以下设置

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

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

D:\MATLAB\EXTERN\INCLUDE

在 Library files 里面加入:

D:\MATLAB\EXTERN\LIB\WIN32\MICROSOFT\MSVC71

最后的MSVC71以安装的matlab版本为准(本文版本为matlab7.1)。

(3) 对该工程,进行以下设置

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

6、代码编辑及dll调用

(1)将前面生成的四个文件:

libsum_prod.ctf

libsum_prod.dll

libsum_prod.h

libsum_prod.lib

复制到 VC 工程所在目录。

(2) 在 VC ++ 6.0 环境中,单击菜单 Project ,选择 Add to Project 菜单项,再单击 Files…子菜单项,出现如下图对话框,

将 libsum_prod.h 加入到当前工程中。

(3) 在Calculate.cpp 中添加以下代码:

void CCalculate::OnCalculate()

{

// TODO: Add your control notification handler code here

//调用动态链接库

if(!libsum_prodInitialize())

{

MessageBox("加载库失败!");

}

// 声明 DLL 函数输入输出 mxArray 对象

mxArray *X,*Y;

mxArray *SUM=NULL,*PROD=NULL;

// 给输入 mxArray 对象分配内存

X = mxCreateDoubleMatrix(1,1,mxREAL);

Y = mxCreateDoubleMatrix(1,1,mxREAL);

// 给输入 mxArray 对象赋值

double p1[1][1], p2[1][1]; //必需以数组形式

UpdateData();

p1[0][0] = m_p1;

p2[0][0] = m_p2;

memcpy(mxGetPr(X),p1,sizeof(double));

memcpy(mxGetPr(Y),p2,sizeof(double));

// 调用 DLL 函数,注意输入与输出的接口是不同的

mlfSum_prod(2,&SUM,&PROD,X,Y) ;

// 返回mxArray 对象值

double *p3, *p4; //必需以指针形式

p3 = mxGetPr(SUM);

p4 = mxGetPr(PROD);

m_p3 = p3[0];

m_p4 = p4[0];

UpdateData(false);

// 释放输入输出 mxArray 对象所占用的内存

// 注意输出对象的内存是在调用 DLL 函数过程中分配的 mxDestroyArray(X);

mxDestroyArray(Y);

mxDestroyArray(SUM);

mxDestroyArray(PROD);

}

编译,链接,运行,最终结果如下。

相关主题
相关文档
最新文档