matlab与vc混合编程
1、 环境设置
在桌面上右键单击“我的电脑”图标出现以下菜单
单击“属性”菜单项,出现“系统特性”对话框,单击“高级”选项卡,如下图所示
中南大学信息科学与工程学院 民主楼316 铁中玉
在上图中,单击“环境变量”按钮,出现“环境变量”对话框,ab 值为 D:\\MATLAB 即 matlab 的安装路径,如下图所示
添加系统变量 matl 中南大学信息科学与工程学院 民主楼316 铁中玉
在环境变量 path 中加入 D:\\MATLAB\\bin\\win32
,如下图所示中南大学信息科学与工程学院 民主楼316 铁中玉
按“确定”完成设置后, 重启计算机或注销当前用户 ,即可应用新设置。
2、 matlab 编译器设置
(1) mex 命令设置
(a) 运行 matlab ,在 matlab 的命令窗口 (Command Window) 键入“ mex -setup ”命令后,按回车键,安装 matlab 编译器;
(b) 命令窗口出现如下提示
mex -setup
中南大学信息科学与工程学院 民主楼316 铁中玉
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 Visual Studio
[2] Lcc C version 2.4.1 in D:\\MATLAB\\sys\\lcc
[3] Microsoft Visual C/C++ version 6.0 in C:\\Program Files\\Microsoft Visual Studio
[4] Open WATCOM C/C++ version 1.3 in D:\\Maple11
[0] None
此时键入 ”3” ,按回车 ;选择 Microsoft Visual C++6.0 的编译器
(d) 命令窗口出现如下提示
中南大学信息科学与工程学院 民主楼316 铁中玉
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 的编译器
(2) mbuild 命令设置
(a) 运行 matlab ,在 matlab 的命令窗口 (Command Window) 键入“ mbuild -setup ”命令后,按回车键,安装 matlab 编译器;
(b) 命令窗口出现如下提示
mbuild -setup
Please choose your compiler for building standalone MATLAB applications:
Would you like mbuild to locate installed compilers [y]/n?
此时键入 ”y” ,按回车;
(c) 命令窗口出现如下提示
中南大学信息科学与工程学院 民主楼316 铁中玉
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 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 的编译器,编译器设置完成。
3、 编写matlab 函数
中南大学信息科学与工程学院 民主楼316 铁中玉
函数文件 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
中南大学信息科学与工程学院 民主楼316 铁中玉
libsum_prod.lib
这些文件是我们后面需要用到的。
注意 : 该命令生成的 dll 文件接口的数据类型是 mxArray
5、 VC++6.0 工程的创建与设置
(1) 建立一个名为 Test 基于 MFC的单文档应用程序
添加一个新的菜单项及其子菜单
按Ctrl+W快捷键,在MFC ClassWizard中为资源ID_SUMPROD配置消息COMMAND(注意是在CMainFrame类中), 选择ADD FUNCTION,点击OK,出现OnSumprod()成员函数。
中南大学信息科学与工程学院 民主楼316 铁中玉
在资源视图中,插入新的对话框,添加如下的对话框,其中“运算”为删掉OK按钮后的新控件,并在MFC ClassWizard为“运算”添加响应函数OnCalculate()。
建立以该对话框为资源的对话框类,命名为CCalculate,并为各编辑框控件映射成员变量。
中南大学信息科学与工程学院 民主楼316 铁中玉
在MainFrm.cpp文件添加头文件#include \"Calculate.h\",并为OnSumprod()成员函数添加代码
void CMainFrame::OnSumprod()
{
// TODO: Add your command handler code here
CCalculate dlg;
dlg.DoModal();
}
中南大学信息科学与工程学院 民主楼316 铁中玉
(2) 对 VC ++ 6.0 ,进行以下设置
单击菜单 Tools ,出现如下菜单
单击 Options… 菜单项,出现 Options 对话框,选择 Directories 标签,在 include files 里面加入:
D:\\MATLAB\\EXTERN\\INCLUDE
中南大学信息科学与工程学院 民主楼316 铁中玉
在 Library files 里面加入:
D:\\MATLAB\\EXTERN\\LIB\\WIN32\\MICROSOFT\\MSVC71
最后的MSVC71以安装的matlab版本为准(本文版本为matlab7.1)。
中南大学信息科学与工程学院 民主楼316 铁中玉
(3) 对该工程,进行以下设置
单击菜单 Project,选择 Setting… 菜单项,出现 Project Setting 对话框,选择 Link 标签,在 Object/library modules: 下面的文本框内容的后面加入 mclmcrrt.lib
libsum_prod.lib ,如下图所示
中南大学信息科学与工程学院 民主楼316 铁中玉
6、 代码编辑及 dll调用
(1) 将前面生成的四个文件:
libsum_prod.ctf
libsum_prod.dll
libsum_prod.h
libsum_prod.lib
复制到 VC 工程所在目录。
中南大学信息科学与工程学院 民主楼316 铁中玉
(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())
中南大学信息科学与工程学院 民主楼316 铁中玉
{
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;
中南大学信息科学与工程学院 民主楼316 铁中玉
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 对象所占用的内存
中南大学信息科学与工程学院 民主楼316 铁中玉
// 注意输出对象的内存是在调用 DLL 函数过程中分配的
mxDestroyArray(X);
mxDestroyArray(Y);
mxDestroyArray(SUM);
mxDestroyArray(PROD);
}
编译,链接,运行,最终结果如下。
因篇幅问题不能全部显示,请点此查看更多更全内容