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);
}
编译,链接,运行,最终结果如下。