1
如何将 Matlab6.5 函数转换成 VC++6.0 函数
% 版权所有:陆振波,海军
工程
路基工程安全技术交底工程项目施工成本控制工程量增项单年度零星工程技术标正投影法基本原理
大学 ( 转载请注明出处 ! )
% 电子邮件: luzhenbo@yahoo.com.cn
% 个人主页: http://blog.sina.com.cn/luzhenbo2
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) 命令窗口出现如下提示:
2
Please choose your compiler for building standalone MA TLAB 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、建立 C++控制台工程
(1) 新建一个 C++控制台工程 Test
其它都采用默认设置。然后在该工程中添加 Test.cpp 文件
3
4、启用 Matlab Add-in 工具条
(1) 在上面的 VC 工程中,在菜单栏的空白处右键单击鼠标,出现如下菜单
点击 Coustomize⋯菜单项,出现如下 Coustomize 对话框,
4
选择 Add-in and Macro Files 标签,选中 MA TLAB Add-in 选项,点 Close 按钮关闭对话框,这里会在
菜单附近出现如下工具条,它就是 Matlab Add-in 工具条。
5、VC++6.0 环境及工程设置
在上面的 VC 工程中,进行以下设置
(1) VC++6.0 环境设置
单击菜单 Tools,出现如下菜单
单击 Options⋯ 菜单项,出现 Options 对话框,选择 Directories 标签,在 include files 里面加入:
C:\MATLAB6P5\EXTERN\INCLUDE
C:\MATLAB6P5\EXTERN\INCLUDE\CPP
5
如下图所示
在 Library files 里面加入:
C:\MATLAB6P5\EXTERN\LIB
C:\MATLAB6P5\EXTERN\LIB\WIN32
C:\MATLAB6P5\EXTERN\LIB\WIN32\MICROSOFT\MSVC60
如下图所示
6
(2) VC++6.0 工程设置
单击菜单 Project,出现如下菜单
单击 Setting⋯菜单项,出现 Project Setting 对话框,选择 Link 标签,在 Object/library modules: 下面
的 文 本 框 内 容 的 后 面 加 入 libmmfile.lib libmatlb.lib libmx.lib libmat.lib libmatpm.lib sgl.lib
libmwsglm.lib libmwservices.lib ,如下图所示
选 择 C/C++ 标 签 , 在 Prerocessor definitions: 下 面 的 文 本 框 内 容 的 后 面 加
入 ,MSVC,IBMPC,MSWIND ,如下图所示
7
设置完成。
6、Matlab 到 C++的代码转换
在上面的 VC 工程中
(1) 将前面 sum_prod.m 文件复制到该 Test 工程所在的目录下
(2) 单击 Matlab Add-in 工具条最左边第一个按钮,出现如下对话框
选中 Windows Console EXE 四个选择选中后二项,如上图所示,单击 OK,出现如下对话框
8
选中 Matlab 函数文件 sum_prod.m,单击“打开”按钮,这样在该工程所在的目录就生成了 sum_prod.cpp
和 sum_prod.hpp 文件。
(3) 打开 sum_prod.cpp 文件,注意到里面有这样一个函数
mwArray sum_prod(mwArray * prod, mwArray p1, mwArray p2)
{ ⋯ }
可以看到在 C++环境中,sum_prod 也是一个函数, 它的输入与输出数据类型是 mwArray ,它是 VC6.0
专门为 Matlab 中的矩阵对象定义的一个类。函数 sum_prod 有三个输入参数和一个输出参数。由于
C++函数不能有一个以上的返回值, 因此这里将 Matlab 函数 sum_prod 的第二个返回值, 以地址型变
量的形式作为 C++ 函数 sum_prod 的第一个输入参数。
7、C++函数的使用
在上面 VC 工程 Test.cpp 文件中键入以下代码:
//********************************************************************
#include "matlab.hpp" // 包含类 mwArray 定义
#include "sum_prod.hpp" // 包含 C++函数 sum_prod
void main()
{
int i,j;
// 定义 C++二维数组
double x[] = {1,2,3,4,5,6};
double y[] = {7,8,9,10,11,12};
double *sum,*prod;
// 初始化与 C++数组相对应的 mwArray 变量
mwArray X(2,3,x);
mwArray Y(2,3,y);
mwArray SUM,PROD;
9
// 调用 C++函数
SUM = sum_prod(&PROD,X,Y);
// 给输出数据分配内存
sum =(double*) calloc(6,sizeof(double));
prod =(double*) calloc(6,sizeof(double));
// 取出输出数据
sum = mxGetPr(SUM.GetData());
prod = mxGetPr(PROD.GetData());
// 输出显示
cout << "SUM = " << endl;
for (i=0;i<2;i++)
{
for (j=0;j<3;j++)
cout << sum[j*2+i] << "\t";
cout << endl;
}
cout << "PROD = " << endl;
for (i=0;i<2;i++)
{
for (j=0;j<3;j++)
cout << prod[j*2+i] << "\t";
cout << endl;
}
// 释放内存
free(sum);
free(prod);
}
//********************************************************************
编译链接程序 ,“忽略”编译过程中有关库文件 msvcrt.lib 的警告。
该 C++程序运算结果如下图所示
10
特别说明一:
在 C\C++ 环境中二维数组是“行向量” ,如果将下面定义的变量 x 看成二维数组的话
double x[] = {1,2,3,4,5,6};
那么 x 应该是 2 3的矩阵,即
x = [1,2,3;
4,5,6];
但是,如果将数组首地址 x 初始化 mwArray 类时, 数组 x 在 mwArray 中是按“列向量” 的形式排列
的,即
X = [1,3,5;
2,4,6];
同理,这里
Y = [7,9,11;
8,10,12];
因此才能得到上图的结果
特别说明二:
通过 Matlab Add-in 实现 Matlab 与 VC++ 的混合编程也有不足, 并不是所有的 Matlab 的函数都能转
成 C++函数 ,这一点在使用过程中要特别注意 !
8、程序的发布
(1) 使用 VC 附带的 Depends 工具找到应用程序所需要的 dll 文件,手动复制这些文件添加到应用
程序所在的目录即可。
(2) 编译好的程序只要 附带 mglarchive.exe (在 C:\MATLAB6p5\extern\lib\win32 目录 ) 中的数学和
图形库即可在没装 matlab 的机器上运行