1、目录VC+ % p1 与 p2 的和 prod = p1.*p2; % p1 与 p2 的点乘该函数完成的是矩阵的求和与点乘的功能,下面将介绍把该代码转换成 C+环境可用的代码的方法。2、Matlab6.5 编译器设置(1) 在同一台电脑上安装 Matlab6.5 和 Visual C+6.0;4(2)mex 命令设置(a)运行 Matlab,在 Matlab 的命令窗口(Command Window)键入“mex -setup”命令后,按回车键,安装 Matlab 编译器;(b) 命令窗口出现如下提示:Please choose your compiler for building exte
2、rnal 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? ySelect a compiler: 1 Digital Visual Fortran version 6.0 in C:Prog
3、ram FilesMicrosoft Visual Studio 2 Lcc C version 2.4 in C:MATLAB6P5syslcc 3 Microsoft Visual C/C+ version 6.0 in C:Program FilesMicrosoft 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 Fi
4、lesMicrosoft 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 mbui
5、ld to locate installed compilers y/n?此时键入”y”,按回车;(c) 命令窗口出现如下提示:1 Lcc C version 2.4 in C:MATLAB6P5syslcc 2 Microsoft Visual C/C+ version 6.0 in C:Program FilesMicrosoft Visual Studio 0 None此时键入”2”,按回车;选择 Microsoft Visual C+6.0 的编译器(d) 命令窗口出现如下提示:Please verify your choices: Compiler: Microsoft Visual
6、 C/C+ 6.0 Location: C:Program FilesMicrosoft Visual StudioAre these correct?(y/n):此时键入”y”,按回车;确认选择 Microsoft Visual C+6.0 的编译器(4) 在 Matlab 的命令窗口(Command Window)键入“cd(prefdir); 5mccsavepath prefdir;”启动 MATLAB add-in 工具条3、建立 C+控制台工程(1) 新建一个 C+控制台工程 Test其它都采用默认设置。然后在该工程中添加 Test.cpp 文件64、启用 Matlab Add-i
7、n 工具条(1) 在上面的 VC 工程中,在菜单栏的空白处右键单击鼠标,出现如下菜单点击 Coustomize菜单项,出现如下 Coustomize 对话框,7选择 Add-in and Macro Files 标签,选中 MATLAB Add-in 选项,点 Close 按钮关闭对话框,这里会在菜单附近出现如下工具条,它就是 Matlab Add-in 工具条。5、VC+6.0 环境及工程设置在上面的 VC 工程中,进行以下设置(1) VC+6.0 环境设置单击菜单 Tools,出现如下菜单单击 Options菜单项,出现 Options 对话框,选择 Directories 标签,在 in
8、clude files 里面加入: 8C:MATLAB6P5EXTERNINCLUDE C:MATLAB6P5EXTERNINCLUDECPP如下图所示在 Library files 里面加入: C:MATLAB6P5EXTERNLIB C:MATLAB6P5EXTERNLIBWIN32 C:MATLAB6P5EXTERNLIBWIN32MICROSOFTMSVC60 如下图所示9(2) VC+6.0 工程设置单击菜单 Project,出现如下菜单单击 Setting菜单项,出现 Project Setting 对话框,选择 Link 标签,在 Object/library modules:
9、下面的文本框内容的后面加入 libmmfile.lib libmatlb.lib libmx.lib libmat.lib libmatpm.lib sgl.lib libmwsglm.lib libmwservices.lib,如下图所示10选择 C/C+标签,在 Prerocessor definitions: 下面的文本框内容的后面加入,MSVC,IBMPC,MSWIND,如下图所示设置完成。116、Matlab 到 C+的代码转换在上面的 VC 工程中(1) 将前面 sum_prod.m 文件复制到该 Test 工程所在的目录下(2) 单击 Matlab Add-in 工具条最左边第一
10、个按钮,出现如下对话框选中 Windows Console EXE 四个选择选中后二项,如上图所示,单击 OK,出现如下对话框选中 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 专门为 Mat
11、lab 中的矩阵对象定义的一个类。函数 sum_prod 有三个输入参数和一个输出参数。由于 C+函数不能有一个以上的返回值,因此这里将 Matlab 函数 sum_prod 的第二个返回值,以地址型变量的形式作为 C+函数 sum_prod 的第一个输入参数。127、C+函数的使用在上面 VC 工程 Test.cpp 文件中键入以下代码:/*#include “matlab.hpp“ / 包含类 mwArray 定义#include “sum_prod.hpp“ / 包含 C+函数 sum_prodvoid main()int i,j;/ 定义 C+二维数组double x = 1,2,3,
12、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;/ 调用 C+函数SUM = sum_prod(/ 给输出数据分配内存sum =(double*) calloc(6,sizeof(double);prod =(double*) calloc(6,sizeof(double);/ 取出输出数据sum = mxGetPr(SUM.GetData();prod = mxGetPr(PROD.Get
13、Data();/ 输出显示cout “SUM = “ endl;for (i=0;i2;i+)for (j=0;j3;j+)cout sumj*2+i “t“;cout endl;cout “PROD = “ endl;13for (i=0;i2;i+)for (j=0;j3;j+)cout prodj*2+i “t“;cout endl;/ 释放内存free(sum);free(prod);/*编译链接程序,“忽略”编译过程中有关库文件 msvcrt.lib 的警告。该 C+程序运算结果如下图所示特别说明一:在 CC+环境中二维数组是“行向量” ,如果将下面定义的变量 x 看成二维数组的话d
14、ouble x = 1,2,3,4,5,6;那么 x 应该是 的矩阵,即23x = 1,2,3;4,5,6;但是,如果将数组首地址 x 初始化 mwArray 类时,数组 x 在 mwArray 中是按“列向量”的形式排列的,即X = 1,3,5;2,4,6;同理,这里Y = 7,9,11;8,10,12;因此才能得到上图的结果14特别说明二:通过 MatlabAdd-in 实现 Matlab 与 VC+的混合编程也有不足, 并不是所有的 Matlab 的函数都能转成 C+函数,这一点在使用过程中要特别注意!8、程序的发布(1) 使用 VC 附带的 Depends 工具找到应用程序所需要的 d
15、ll 文件,手动复制这些文件添加到应用程序所在的目录即可。(2) 编译好的程序只要附带 mglarchive.exe(在 C:MATLAB6p5externlibwin32 目录) 中的数学和图形库即可在没装 matlab 的机器上运行总 结从 以 上 的 讨 论 中 可 以 清 楚 的 看 到 , 使 用 Matlab 生 成 动 态 链 接 库 (*.DLL) 实 现 VC 和 Matlab 的 混 编 的 确 以 它 的 方 便 , 易 用 成 为 VC+和 Matlab 混 编 的 一 种 快 速 实 现 方 法 。 另 外 , Matlab 的 Compiler 也 具 有 一 定
16、的 局 限 性 : 原 则 上 在 混 编 的 过 程 中 只 能 使 用 Matlab 数 学 库 中 的 函 数 和 图 形 库 中 的 部 分 函 数 , mathworks 提 供 的 文 档 上 面 讲 到 ,Matlab 的 图 形 库 只 有 在 用 mcc 生 成 可 执 行 程 序 (*.exe) 时 才 能 引 用 。 在 VC+的 程 序 中 直 接 使 用 Matlab 图 形 库 中 的 函 数 ( 例 如 mlfPlot) 是 不 背 支 持 的 。 另 外 , 在 使 用 mcc 生 成 DLL 的 时 候 , Matlab 图 形 库 中 的 函 数 也 不 是
17、 全 部 都 测 试 过 。 还 有 对 于 一 些 工 具 箱 中 的 函 数 , 如 果 用 到 一 些 数 学 库 之 外 的 函 数 , 就 有 可 能 出 现 错 误 。 即 使 编 译 通 过 , 在 运 行 的 时 候 也 有 可 能 出 错 。 但 是 , 随 着 Matlab 的 不 断 升 级 , mathworks 推 出 了 Matlab COM Builder 创 建 COM 组 件 , 对 这 种 不 兼 容 性 有 了 一 定 的 改 进 , 使 得 Matlab 和 高 级 语 言 的 混 合 编 程 变 得 越 来 越 实 用 , 越 来 越 简 单 。 参 考 文 献 : 1 Matlab Compiler 2 Matlab COM Builder